Paginação

12 respostas
T

oi, pessoal…

Seguinte… tenho uma base de dados aqui com + de 300000 registros, cada um com 26 colunas, e ja percebi que é inviavel trazer todos eles
pra memoria… qto mais pra um ArrayList pra jogra em um TableModel… se eu quiser fazer uma listagem de todos eles, qual
a sugestão que vcs me dao, pra trazer esse registro aos poucos…

Esse tópico ja foi discutido, mas na epoca nao me eslcareceram bem…
Acho que pq eu nao expliquei direito tb…

[]s

F.L

12 Respostas

R

Depende do banco de dados que vc esta usando. Com mysql vc limita a qtde de registando usando a clausula LIMIT start, count. No postgresql eh LIMIT count OFFSET start.

Rafael

T

Rafael Steil:
Depende do banco de dados que vc esta usando. Com mysql vc limita a qtde de registando usando a clausula LIMIT start, count. No postgresql eh LIMIT count OFFSET start.

Rafael

Interessante, Rafael… nao sabia dessa clausula…

Mas, qual seria a lógica que vc usaria?
Pode me decrever mais ou menos os passos?

R

Bom, nao tem mto segredo. Voce tem que ter um parametro para saber em que registro comecar, e outro para a quantidade de registros a retornar. Ai eh soh passar eles para o metodo que faz a query. Por exemplo, se vc quer mostrar de 50 em 50, o “start” comeca em 0, e a cada nova pagina vc acrescenta 50 ao valor atual de start. Assim, a primeira parte eh de 0 … 49, a segunda 50 … 100 etc… E entao soh passa isso para a query.

Em http://dev.mysql.com/doc/mysql/en/select.html vc tem a documentacao sobre o Mysql, e em http://www.postgresql.org/docs/7/static/sql-select.htm do postgresql.

Rafael

J

Não seria mais interessante alguma solução menos dependente do banco de dados? E neste caso, quais as opções?

R

Nao ha solucao independente. Qualquer outro caso vai fazer com que vc pegue todos os dados e manipule via codigo Java, o que eh extremamente ruim.

A “indendencia” teria que ser feita no braco, talvez montando a query dinamicamente de acordo com o banco de dados a ser utilizado. Mas, se for para fazer algo assim, eh muito mais facil ter a query pronta para cada banco ja (caso, obviamente, a aplicacao necessite de rodar em todos os bancos possiveis).

Rafael

T

Rafael Steil:
Nao ha solucao independente. Qualquer outro caso vai fazer com que vc pegue todos os dados e manipule via codigo Java, o que eh extremamente ruim.

A “indendencia” teria que ser feita no braco, talvez montando a query dinamicamente de acordo com o banco de dados a ser utilizado. Mas, se for para fazer algo assim, eh muito mais facil ter a query pronta para cada banco ja (caso, obviamente, a aplicacao necessite de rodar em todos os bancos possiveis).

Rafael

Valeu, rafael, entendi sua ultima reposta e ajudou muito…

[]s

F.L

J

Olá Rafael,

O tópico já passou do prazo um pouco, mas me surgiu uma dúvida:

Como fazer paginação no caso de estar usando Hibernate (não sei muita coisa de Hibernate)?

Valeu

R

Nao tenho ideia :mrgreen: … De uma olhada aqui: http://www.hibernate.org/243.html

Rafael

I

<Propaganda sem fins lucrativos> Na mundo java desse mês você encontra um artigo sobre hibernate, que em partes detalha uma paginação de dados ok? </propaganda sem fins lucrativos>

Umlauf e Filipini não se esqueçam de me convidar para a noite de autografos… hehehehe
Sério agora… o artigo está ótimo, parabéns a vocês!!! :thumbup: :thumbup: :thumbup:

_

Dando um preview:

Criteria c = session.createCriteria( Pessoa.class );
c.setFirstResult( 150 );
c.setMaxResults( 50 );

E o Hibernate se coça para adptar isso para o dialect que você indicou :smiley:

R

Então,

O artigo é bacana sim sobre o Hibernate. Só um detalhe que não é mencionado quanto a paginação é que o Collection que o createFilter recebe não pode ser qualquer um, mas somente de uma classe persistida…

Confere ?

abraço.

N

Não seria o caso de utilizar a Classe Criteria do Hibernate??

public java.util.List consultaTodos (int firstResult, int maxResult) throws Exception{
    Session session = factory.openSession();
    
    Criteria criteria = session.createCriteria(TipoPerfil.class);
    criteria.setMaxResults(maxResult);
    criteria.setFirstResult(firstResult);
    criteria.addOrder(Order.asc("nome"));
    List listaPerfil = criteria.list();
    
    session.flush();
    session.close();
    return listaPerfil;
 }

com o método pronto só precisa passar o valor do firstResult, que no caso seria o firstResult anterior + o maxResult :wink:

Abraço a todos,
PS: primeiro post no fórum hein galera, naum me bombardeem demais :wink:

Criado 14 de março de 2005
Ultima resposta 2 de mai. de 2005
Respostas 12
Participantes 7