paginação jsf e jpa

8 respostas
J

oie galera

atualmente minha aplicacao está fazendo paginação na tela, por meio do datatable do primefaces. Contudo, possuo uma tabela muito grande com milhares de registros, causando lentidão.
Quero mudar para paginação do hibernate mais nao consigo ver como isso poderia ser feito.

Na minha consulta eu faço isso:

public List<T> find() 
		{
	         CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
	         cq.select(cq.from(entityClass));
	         javax.persistence.Query q = getEntityManager().createQuery(cq);
	         q.setFirstResult(0);
	         q.setMaxResults(10);
	         return q.getResultList();
	     }

mas desse jeito ele sempre me traz apenas os 10 primeiros da tabela.

E para usar a paginação do hibernate eu teria que desabilitar a paginação do jsf?

O método setFirstResult() e setMaxResults() não teria que receber valores dinamicamente (via get por exemplo)? Se sim, como seria feito usando jsf?

OO DUVIDA CRUEL

:shock: :lol:

8 Respostas

A

Se você utilizar o JSF + Primefaces, você terá uma paginação automática, não vai nem precisar se preocupar quanto ao número de registros, pois o componente já faz a otimização da paginação. Dê uma olhada nesse link aqui

J

mas a paginação dele é em memoria. Eu quero fazer paginação no banco, porque ao trazer muitos registros, está caindo a aplicação toda hora.

Hoje minha aplicação está com paginação em memoria, por isso esta lenta

quero fazer no banco.

J

só para constar, eu estou usando primefaces ja.

A

Se o número de registros é tão grande assim, utilize inicialização lenta, isso deve ajudar, se você não estiver utilizando lazy ele vai carregar 100% dos registros.

J

eu acredito que isso ajuda, mas nao resolve o problema.

Imagina 200 mil registros vindo do banco, mesmo estando como lazy vai ser mta informacao trafegando de uma vez só. E eu nao preciso disso tudo, uma vez que sao exibidos poucos registros na tela.

Por isso quero paginar pelo banco.

Só quero entender como obter a pagina atual e o total do datatable para paginar pelo banco

D

Caro javaCBA,
Pela forma q vc criou, seu metodo ele irá realmente trazer apenas os 10 primeiros registros sempre.
q.setFirstResult(0); – Aqui vc está setando que o primeiro indice que o JPA deverá pegar será 0(ou seja, sempre pagina 1)
q.setMaxResults(10); – Aqui vc está setando o numero de linhas por paginas.

O correto deveria ser:

public List<T> find(int first, int max) { CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); javax.persistence.Query q = getEntityManager().createQuery(cq); q.setFirstResult(first); q.setMaxResults(max); return q.getResultList(); }

Dessa forma vc deixa que a sua Datadable informe qual a pagina atual e o numero de linhas por paginas.

B

Pessoal,
escrevi um artigo que explica passo-a-passo a paginação do JSF 2 + Primefaces acessando o banco de dados. No artigo eu utilizo apenas a especificação JPA.
Espero que possa ajudar.

S

Sei que não tenho nada a ver com o assunto, mas também tenho a dúvida, como fica no bean e na visão (xhtml)?

Criado 23 de setembro de 2011
Ultima resposta 16 de jul. de 2012
Respostas 8
Participantes 5