Fala galera, estou com dificuldades para implementar o filtering em uma lazy datatable do primefaces, principalmente na hora de implementar o codigo de pesquisar por nome no dao generico e acredito que necessitarei dele no DataModelCliente na hora de setar o filtro, olhei inumeros exemplos mas falhei miseravelmente, tanto que na classe eu tentei sem ser generico mesmo então desconsiderem :oops:
eu consegui fazer paginação e implementar o lazy seguindo exemplos da caelum então tudo está bem padrão de apostila mesmo…
se alguem puder me dar uma luz…
segue minhas classes
-Dao generico
public class DAO<T> implements Serializable {
private final Class<T> classe;
public DAO(Class<T> classe) {
this.classe = classe;
}
//...
//metodo que lista todos clientes
public List<T> listaTodos() {
EntityManager em = new JPAUtil().getEntityManager();
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).getResultList();
em.close();
return lista;
}
public T buscaPorId(Long id) {
EntityManager em = new JPAUtil().getEntityManager();
T instancia = em.find(classe, id);
em.close();
return instancia;
}
public int contaTodos() {
EntityManager em = new JPAUtil().getEntityManager();
long result = (Long) em.createQuery(
"select count(n) from " + classe.getName() + " n")
.getSingleResult();
em.close();
return (int) result;
}
//metodo que uso para paginacao de todos
public List<T> listaTodosPaginada(int firstResult, int maxResults) {
EntityManager em = new JPAUtil().getEntityManager();
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
query.select(query.from(classe));
List<T> lista = em.createQuery(query).setFirstResult(firstResult)
.setMaxResults(maxResults).getResultList();
em.close();
return lista;
}
//+- o metodo que pensei em buscar pelo nome do cliente, mas gostaria q fosse generico
public List<Cliente> buscaPorNome(String nomeCliente) {
EntityManager em = new JPAUtil().getEntityManager();
String jpql = "select c from Cliente c where lower(c.nomeCliente) like :nomeCliente"
+ " order by c.nomeCliente";
TypedQuery<Cliente> query = em.createQuery(jpql, Cliente.class);
query.setParameter("nomeCliente", "%" + nomeCliente + "%");
return query.getResultList();
}
-ClienteBean
@ViewScoped
@Named
public class ClienteBean implements Serializable {
private Cliente cliente = new Cliente();
private List<Cliente> clientes;
private Long clienteIdCliente;
@Inject
private DAO<Cliente> dao;
//...
//metodo que lista todos clientes
public List<Cliente> getClientes() {
if (clientes == null) {
System.out.println("Carregando lista de clientes...");
clientes = new DAO<Cliente>(Cliente.class).listaTodos();
}
return clientes;
}
//metodo que eu usaria para pegar o nome, pensei em algo assim mas creio que nao esta certo
public List<Cliente> buscaNome(String nome) {
return dao.buscaPorNome(nome);
}
ListaClientesBean
@ViewScoped
@Named
public class ListaClientesBean implements Serializable {
private LazyDataModel<Cliente> dataModel;
public ListaClientesBean() {
this.dataModel = new DataModelCliente();
DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
this.dataModel.setRowCount(dao.contaTodos());
this.dataModel.setPageSize(5);
}
public LazyDataModel<Cliente> getDataModel() {
return dataModel;
}
DataModelCliente
public class DataModelCliente extends LazyDataModel<Cliente> {
public List<Cliente> load(int inicio, int quantidade,
String campoOrdenacao, SortOrder sentidoOrdenacao,
Map<String, String> filtros) {
DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
return dao.listaTodosPaginada(inicio, quantidade);
}
cliente.xhtml
minha duvida aqui tb é se o filteredValue teria q filtrar pelo metodo do ClienteBean(buscaNome) ou se ja era possivel passar de algum modo no listaClientesBean mesmo
<p:dataTable value="#{listaClientesBean.dataModel}" widgetVar="clientesTable" emptyMessage="nenhum cliente com esses parametros foram encontrados" filteredValue="#{clienteBean.buscaNome}" id="display" var="cliente" paginator="true" rows="5" lazy="true" dynamic="true" styleClass="dados" rowClasses="impar,par" paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" rowsPerPageTemplate="5,10,15">
<p:column headerText="Nome" id="colunaNome" filterBy="#{cliente.nomeCliente}" filterMatchMode="contains">
<h:outputText value="#{cliente.nomeCliente}"/>
</p:column>
<p:column headerText="CPF">
#{cliente.cpfCliente}
</p:column>
<p:column headerText="RG">
#{cliente.rgCliente}
</p:column>