JSF - Primefaces - Datatable paginado

Olá amigos,

Estou iniciando o uso com o Primefaces e estou configurando o Datatable paginado e vi uma solução com o LazyDataModel. Eu até consigo consultar os dados no banco mas a tabela não é carregada.

Seguem os códigos:

classe.xhtml

<p:dataTable var="classe" value="#{classeManagedBean.lista}"
				paginator="true" rows="10"
				selectionMode="single"
				lazy="true" dynamic="true"
				paginatorTemplate="{PageLinks}"
				rowsPerPageTemplate="5,10,15"
				emptyMessage="#{msg.classe_tabela_vazia}">
</p:dataTable>

ClasseManagedBean.java


//No Construtor - Onde lista é um atritubo LazyDataModel e remote é um EJB que faz acesso ao EntityManager e realiza a consulta.
public ClasseManagedBean() {
   if (lista == null) {
      lista = new LazyDataModel<Classe>() {

      @Override
      public List<Classe> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
            List<Classe> classes = remote.findAllClasses(pageSize, first);
	    return classes;
       };
       lista.setPageSize(10);
   }
}

public LazyDataModel<Classe> getLista() {
   return lista;
}

Tais métodos são chamados normalmente porém a tabela permanece vazia.

Alguém pode me ajudar? A versão do Primefaces é a 2.2.1.

Desde já agradeço.

andersonfs,

Passei por esse mesmo problema, infelizmente essa última versão do primefaces (2.2.1 e também a 3.0M1) possui um bug no lazy load, com a primeira página.
Você pode conferir aqui: http://code.google.com/p/primefaces/issues/detail?id=1526
O bug acontece na primeira página, tenta dá um sort, ou ir pra outra página que verá o resultado.

Putz… e no meu caso nem os botões da paginão estão aparecendo. Dai não consigo nem ir para a próxima página.

Qual foi a solução de paginação que você usou então? Podes falar?

Te agradeço.

Abs

Vi que está faltando o total de registros da tabela:

@Override public List<Classe> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) { List<Classe> classes = remote.findAllClasses(pageSize, first); return classes; };

faltou o rowCount:

 teuLazyDataModel.setRowCount(dao.recuperarTotatRegistros());

Sendo assim a tabela vai calcular a quantidade de páginas. Em relação ao bug, não resolvi, estou esperando a correção deles que está prevista ainda para essa 3.0. Mas como eu te disse, ao paginar ou realizar um “sort” os registros aparecem.

Outra coisa você disse: “remote é um EJB” e está sendo chamado no construtor, isso teoricamente não funciona, já que no construtor não vai acontecer a injeção de dependência do EJB, então remote estaria null. Uma boa prática é criar um método anotado com @PostConstruct (javax.annotation.PostConstruct, que diz que sempre será chamado ao construir o bean).

Poderia usar tipo:


 @PostConstruct
    public void carregarLazyDataModel() {
       
   //carregar o lazy datamodel

    }

e o managedbean deve está com scopo de view.

ayslanms

Funcionou!

Em partes… os registros foram carregados na tabela, mas os botões de paginação não foram. Os seus ai aparecem?

Abraços.

Aparecem sim, tenta debugar para ver se o dao trás a quantidade de os resultados esperados.

ayslanms

Ele está trazendo os registros certos, eu passei o start e o pageSize para o EJB que executa a consulta, e lá eu fiz da seguinte forma:

No EJB

public List<Classe> findAllClasses(int pageSize, int first) {
		final StringBuilder sql = new StringBuilder(
				"Select c from Classe c order by codigo");
		final Query query = entityManager.createQuery(sql.toString());
		query.setFirstResult(first);
		query.setMaxResults(pageSize);
		final List<Classe> lista = query.getResultList();
		return lista;
}

Ele trouxe dex registros, pois foi esse o tamnho da página.

Mas não exibe os botões de paginação.

Para exibir basta fazer da seguinte forma não é mesmo:

<p:dataTable var="classe" 
				value="#{classeManagedBean.lista}"
				paginator="true" 
				rows="10"
				selectionMode="single"
				lazy="true" dynamic="true"
				paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15"
				emptyMessage="#{msg.classe_tabela_vazia}">

Eu preciso configurar algo a mais?

Agradeço pelo apoio.

e a query do rowCount, que é a quantidade total de registros.