Utilizando opções avançadas
Implementando paginação dos dados ... introduzir mecanismo e lazy loading explicar interface Pagination (unidade básica de paginação) e contexto de paginação PaginationContext, disponível através de injeção o exemplo em questão é específico para o PrimeFaces se for utilizar outra implementação, tal como RichFaces, ... código será semelhante No pacote br.gov.frameworkdemoiselle.sample.view altere a classe BookmarkListMB incluindo nela as linhas de código a seguir: private DataModel<Bookmark> dataModel; @Override @SuppressWarnings("unchecked") public DataModel<Bookmark> getDataModel() { if (dataModel == null) { dataModel = new LazyDataModelImpl(); } return dataModel; } private class LazyDataModelImpl extends LazyDataModel<Bookmark> { private static final long serialVersionUID = 1L; private boolean loaded = false; @Override public int getRowCount() { if (!loaded) { getPagination(); handleResultList(); loaded = true; } return getPagination().getTotalResults(); } @Override public List<Bookmark> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) { Pagination pagination = getPagination(); pagination.setPageSize(pageSize); pagination.setFirstResult(first); return handleResultList(); } } A interface DataModel pertence à especificação JSF, enquanto que a classe abstrata LazyDataModel é uma implementação da primeira fornecida pelo framework PrimeFaces. No diretório /src/main/webapp/, altere o arquivo bookmark_list.xhtml substituindo apenas a tag p:dataTable com o conteúdo seguinte: <p:dataTable id="list" height="300" var="bean" value="#{bookmarkListMB.dataModel}" lazy="true" paginator="true" rows="#{bookmarkListMB.pageSize}" pageLinks="#{bookmarkListMB.maxPageLinks}"> ... No diretório /src/main/resources/, altere o arquivo demoiselle.properties incluindo as linhas a seguir: frameworkdemoiselle.pagination.default.page.size = 5 frameworkdemoiselle.pagination.max.page.links = 3 ...
Paginação de dados na aplicação Bookmark Aplicação Bookmark em funcionamento
... INFO [STDOUT] Hibernate: select top ? count(bookmark0_.id) as col_0_0_ from Bookmark bookmark0_ INFO [STDOUT] Hibernate: select top ? bookmark0_.id as id4_, bookmark0_.description as descript2_4_, bookmark0_.link as link4_ from Bookmark bookmark0_ INFO [STDOUT] Hibernate: select limit ? ? bookmark0_.id as id4_, bookmark0_.description as descript2_4_, bookmark0_.link as link4_ from Bookmark bookmark0_ // todo: explicar superficialmente como implementar no RF... import org.richfaces.component.UIDatascroller; import org.richfaces.event.DataScrollerEvent; // evento específico do RichFaces public void updatePage(DataScrollerEvent e) { int index = ((UIDatascroller) e.getComponent()).getPage(); Page pagina = new Page(getRows(), index); recarregarLista(pagina); } <rich:datascroller for="table" maxPages="#{bookmarkListMB.maxPages}" page="#{bookmarkListMB.currentPage}" reRender="table" scrollerListener="#{bookmarkListMB.updatePage}" /> <rich:dataTable width="100%" value="#{bookmarkListMB.lazyModel}" rows="#{bookmarkListMB.pageSize}" var="element" rowKeyVar="row" id="table">