Depois que adicionei FilterBy na minha tabela quando eu digito algo ele filtra direito, mas se depois eu usar a paginação os campos da tabela ficam Vazios, Preço vira R$0,00 e Data a data atual.
Tem como consertar isso?
É possível utilizar esses recursos com paginação Lazy onde só se busca uma parte dos dados ao invés de todos os dados? Se sim, como?
livro.xhtml
<h:form id="formTabelaLivros">
<p:dataTable id="tabelaLivros" value="#{livroBean.livros}" var="livro" paginator="true" rows="5">
<f:facet name="header">Livros</f:facet>
<p:column headerText="Título" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith">
<h:outputText value="#{livro.titulo}"/>
</p:column>
<p:column sortBy="#{livro.isbn}" filterBy="#{livro.isbn}" filterMatchMode="contains">
<f:facet name="header">ISBN</f:facet>
<h:outputText value="#{livro.isbn}"/>
</p:column>
<p:column sortBy="#{livro.preco}" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}">
<f:facet name="header">Preço</f:facet>
<h:outputText value="#{livro.preco}">
<f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$"
locale="pt_BR"/>
</h:outputText>
</p:column>
<p:column sortBy="#{livro.dataLancamento.time}" filterBy="#{livro.dataLancamento.time}"
filterMatchMode="contains">
<f:facet name="header">Data</f:facet>
<h:outputText value="#{livro.dataLancamento.time}">
<f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
</h:outputText>
</p:column>
<p:column>
<f:facet name="header">Alterar</f:facet>
<h:commandLink value="Alterar" >
<f:setPropertyActionListener target="#{livroBean.livro}"
value="#{livro}"/>
</h:commandLink>
</p:column>
<p:column>
<f:facet name="header">Remover</f:facet>
<h:commandLink value="Remover" action="#{livroBean.remover(livro)}"/>
</p:column>
</p:dataTable>
</h:form>
LivroBean.java
package br.com.caelum.livraria.bean;
import java.util.List;
import java.util.Locale;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.validation.ValidationException;
import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;
@ViewScoped
@ManagedBean
public class LivroBean {
private Livro livro = new Livro();
private Integer livroId;
private Integer autorId;
private List<Livro> livros;
public Livro getLivro() {
return livro;
}
public void setLivro(Livro livro) {
this.livro = livro;
}
public void gravar() {
System.out.println("Gravando livro " + this.livro.getTitulo());
if (livro.getAutores().isEmpty()) {
FacesContext.getCurrentInstance().addMessage("autor",
new FacesMessage("Livro deve ter pelo menos um Autor"));
return;
}
DAO<Livro> dao = new DAO<Livro>(Livro.class);
if(this.livro.getId() == null) {
dao.adiciona(this.livro);
this.livros = dao.listaTodos();
} else {
dao.atualiza(this.livro);
}
this.livro = new Livro();
}
public void carregarLivroPeloId() {
Integer id = this.livro.getId();
this.livro = new DAO<Livro>(Livro.class).buscaPorId(id);
}
public Integer getAutorId() {
return autorId;
}
public void setAutorId(Integer autorId) {
this.autorId = autorId;
}
public List<Autor> getAutores() {
return new DAO<Autor>(Autor.class).listaTodos();
}
public void gravarAutor() {
Autor autor = new DAO<Autor>(Autor.class).buscaPorId(autorId);
this.livro.adicionaAutor(autor);
}
public void carregar(Livro livro) {
System.out.println("Carregando livro " + livro.getTitulo());
this.livro = livro;
}
public void remover(Livro livro) {
System.out.println("Removendo livro " + livro.getTitulo());
new DAO<Livro>(Livro.class).remove(livro);
}
public void removerAutorDoLivro(Autor autor) {
this.livro.removeAutorDoLivro(autor);
}
public List<Autor> getAutoresDoLivro() {
return this.livro.getAutores();
}
public List<Livro> getLivros() {
DAO<Livro> dao = new DAO<Livro>(Livro.class);
if(this.livros == null) {
this.livros = dao.listaTodos();
}
return this.livros;
}
public void comecaComDigitoUm(FacesContext fc, UIComponent component, Object value)
throws ValidationException {
String texto = value.toString();
if(!texto.startsWith("1")) {
throw new ValidatorException(
new FacesMessage("ISBN deve começar com digito um."));
}
}
public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) {
//tirando espaços do filtro
String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();
System.out.println("Filtrando pelo: " + textoDigitado + ", valor do elemento: " + valorColuna);
//o filtro é nulo ou vazio?
if(textoDigitado == null || textoDigitado.equals("")) {
return true;
}
//elemento da tabela é nulo?
if (valorColuna == null) {
return false;
}
try {
//fazendo o parsing do filtro para converter para Double
Double precoDigitado = Double.valueOf(textoDigitado);
Double precoColuna = (Double) valorColuna;
//comparando os valores, compareTo devolve um valor negativo se o value é menor do que o filtro
return precoColuna.compareTo(precoDigitado) < 0;
} catch (NumberFormatException e) {
//usuario nao digitou um numero
return false;
}
}
public Integer getLivroId() {
return livroId;
}
public void setLivroId(Integer livroId) {
this.livroId = livroId;
}
}