Como fazer uma paginação Ajax, consultando o banco de dados, utilizando o primefaces e o componente p:dataTable.
No showcase do primefaces tem um exemplo muito simples usando a paginação, lá simplesmente ele retorna uma lista randômica. Só que na prática é diferente quando precisamos de acesso ao banco de dados. Para fazer a paginação precisa saber a página atual, a quantidade de registros, o campo de ordenação, o sentido da ordenação (asc ou desc) para assim na minha query já retornar paginado. Apenas exibir uma lista com muitos dados pode ser pesado na aplicação. Alguém pode ajudar?
Faça com lazy=true. Segue um exemplo:
<p:dataTable id="transacaoDataTable" var="transacao" value="#{extratoController.lazyTransacaoDataModel}" paginator="true" rows="10" lazy="true" dynamic="true"
paginatorTemplate="{PageLinks}" >
E na classe ExtratoController:
private LazyDataModel<Transacao> lazyTransacaoDataModel;
E no get você coloca o método de buscar no banco de dados. Repare nos parâmetros first e pageSize do método load. Esses parâmetros são usados para fazer a paginação lazy.
[code]
public LazyDataModel getLazyTransacaoDataModel() {
if (lazyTransacaoDataModel == null) {
lazyTransacaoDataModel = new LazyDataModel() {
@Override
public List<Transacao> load(int first, int pageSize, String string, boolean bln, Map<String, String> map) {
List<Transacao> pesquisaTransacao = transacaoService.buscaParaExtrato(funcionarioAux, getDataInicioAux(), getDataFimAux(),
pageSize, first);
return pesquisaTransacao;
}
};
lazyTransacaoDataModel.setPageSize(10);
}
return lazyTransacaoDataModel;
}[/code]
Obrigado pela ajuda. Era exatamente isso que eu precisava.
Desculpe por re-abrir o post antigo, mas estou com dúvidas.
Caso eu queira colocar filtros fora do datatable, por exemplo, quero colocar um filtro por periodo de:dataInicial até:dataFinal, como executo a consulta ja que os filtros do load são apenas dos compos filters do datatable.
Obrigado