Boa tarde galera.
Estou desenvolvendo uma aplicação em JSF com Primefaces, surgiu a necessidade de fazer uma páginação. Li alguns tuto, mas não foram muito esclarecedores para mim, então resolvi contatar o pessoal daqui para sanar as minhas dúvidas.
Seguinte, estou desenvolvendo a Paginação em cima do componente Datatable.
Exemplo: Tenho 100 registros no meu DB, e quando carregar a minha View, pegar os 20 primeiros desses 100. O usuário clica na página seguinte, carregar do registro 21-40, por exemplo.
Pesquisei na web uma função da Datatable que me retorne o número da página atual do usuário, para dai a partir desta informação, fazer a consulta no DB, carregar para a minha DATAMODEL e retornar para a View o resultado.
O meu problema está ai, não estou conseguindo ( e não descobri até então ) pegar a “página” atual do datatable para fazer essa consulta.
Utilizo JSF, PrimeFaces 3.2 , Hibernate e um Banco de Dados Mysql.
View
<p:dataTable paginator="true" rows="10" rowsPerPageTemplate="10,20,50,100"
value="#{agenciaController.listaAgencia}" var="agenciaBancaria"
emptyMessage="Nenhum Agência cadastrada." widgetVar="AgenciaTable"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
pageLinks="30">
<p:column>
<f:facet name="header">
Código
</f:facet>
<h:outputText value="#{agenciaBancaria.id}"/>
</p:column>
<p:column>
<f:facet name="header">
Agência
</f:facet>
<h:outputText value="#{agenciaBancaria.codigoAgencia}"/>
</p:column>
<p:column>
<f:facet name="header">
Mnunicípio
</f:facet>
<h:outputText value="#{agenciaBancaria.municipio}" rendered="#{agenciaBancaria.municipio != null}"/>
</p:column>
<p:column>
<f:facet name="header">
UF
</f:facet>
<h:outputText value="#{agenciaBancaria.uf}" rendered="#{agenciaBancaria.uf != null}"/>
</p:column>
<p:column>
<f:facet name="header">
Nome
</f:facet>
<h:outputText value="#{agenciaBancaria.nome}"
rendered="#{agenciaBancaria.nome != null}"/>
</p:column>
<p:column>
<f:facet name="header">
CNPJ
</f:facet>
<h:outputText value="#{agenciaBancaria.cnpj}"
rendered="#{agenciaBancaria.cnpj != null}"/>
</p:column>
<p:column>
<f:facet name="header">
Telefone
</f:facet>
<h:outputText value="#{agenciaBancaria.telefone}"
rendered="#{agenciaBancaria.telefone != null}"/>
</p:column>
</p:dataTable>
Controller (Parte que interessa)
private DataModel<AgenciaBancariaPaginator> listAgencia;
private AgenciaBancariaDao agenciaDao = new AgenciaBancariaDao();
@PostConstruct
public void init() {
carregaLista();
}
private void carregaLista() {
agenciaDao = new AgenciaBancariaDao();
listAgencia = agenciaDao.PaginacaoAgenciaBancaria("primeiro registro que quero buscar", 20); // o 20 significa que quero buscar 20 registros por vez
}
public DataModel<AgenciaBancariaPaginator> getListaAgencia() {
return listAgencia;
}
public void setListaAgencia(DataModel<AgenciaBancariaPaginator> listaAgencia) {
this.listAgencia = listaAgencia;
}
DAO
public DataModel<AgenciaBancariaPaginator> PaginacaoAgenciaBancaria(int registroInicial, int numeroMaximoRegistro) {
Criteria criteria = HibernateUtil.getSessionFactory(false, false).openSession().createCriteria(AgenciaBancaria.class);
criteria.setFirstResult(registroInicial);
criteria.setMaxResults(numeroMaximoRegistro);
criteria.createAlias("municipio", "mun");
ProjectionList projacaoLista = Projections.projectionList();
projacaoLista.add(Projections.property("id").as("id"));
projacaoLista.add(Projections.property("nome").as("nome"));
projacaoLista.add(Projections.property("codigoAgencia").as("codigoAgencia"));
projacaoLista.add(Projections.property("cnpj").as("cnpj"));
projacaoLista.add(Projections.property("ddd").as("ddd"));
projacaoLista.add(Projections.property("telefone").as("telefone"));
projacaoLista.add(Projections.property("mun.nome").as("municipio"));
projacaoLista.add(Projections.property("mun.uf").as("uf"));
criteria.setProjection(projacaoLista);
criteria.add(Restrictions.eq("ativo", true));
criteria.setResultTransformer(Transformers.aliasToBean(AgenciaBancariaPaginator.class));
DataModel<AgenciaBancariaPaginator> lista = new ListDataModel<AgenciaBancariaPaginator>(criteria.list());
HibernateUtil.closeSessionFactory();
return lista;
}
Acho que é isso a parte de relevância do Código.
Agradeço a atenção.
Valeu