Vraptor + Hibernate + Paginação

Olá pessoal

Estou com dificuldade de fazer paginação.

Estou usando displaytag para listar.

Alguém!

vc já colocou o atributo “pagesize”?

ex:

<display:table id="cliente" pagesize="10"> ... </display:table>

cleison, se for aquele caso dos 29mil registros, o displaytag puro não vai ajudar…

tenta fazer o simples: uma lógica que recebe um int que é a página que vc tá…

na sua query (ou criteria) coloque:

query.setMaxResults(20).setFirstResult(pagina*20)

e mostre os resultados numa tabela comum… com isso funcionando é só adaptar pro que vc precisa

[quote=Lucas Cavalcanti]cleison, se for aquele caso dos 29mil registros, o displaytag puro não vai ajudar…

tenta fazer o simples: uma lógica que recebe um int que é a página que vc tá…

na sua query (ou criteria) coloque:

query.setMaxResults(20).setFirstResult(pagina*20)

e mostre os resultados numa tabela comum… com isso funcionando é só adaptar pro que vc precisa
[/quote]

Isso mesmo Lucas.

no meu Dao ficou assim

public List<Produto> listaTudo(int first, int max) {  
		Criteria criteria = this.session.createCriteria(Produto.class);  
		criteria.addOrder(Order.asc("nome"));  
		criteria.setFirstResult(first);  
		criteria.setMaxResults(max);  
	return criteria.list();  
 } 

O que poderia fazer no meu controller e jsp?

lista como se vc estivesse com a lista inteira…

a única diferença é que vc tem o parâmetro page, e vai definir qtos resultados por página.

no jsp é só colocar links pra próxima página, ou usar um link como esse: http://plugins.jquery.com/project/pagination

Alguém já testou isto?
http://code.google.com/p/jmesa/

Legal! :smiley:
http://code.google.com/p/jmesa/wiki/JSPTagTutorialV3

Abraço!

Se você der uma pesquisada aqui no guj nos meus posts há um que eu explico como fazer uma paginação bem interessante, integrando taglib + hibernate para paginar, inclusive com um converter para o Vraptor.

Fla Garcia

Pesquisei bastante, vi esse o post abaixo mas não compreendi como aplicar.

http://www.guj.com.br/posts/list/206481.java#1078145

Como listar a quantidade de registro desta lista?

public List<Produto> listaTudo(int pagina) {
		Criteria criteria = this.session.createCriteria(Produto.class); 
		criteria.addOrder(Order.asc("codProduto"));
		criteria.setFirstResult(pagina * 20);  
		criteria.setMaxResults(20);
	return criteria.list();  
	}

qto tem no total?
vc vai precisar fazer 1 select a mais:

Long totalDeRegistros = session.createQuery("select count(*) from Produto").uniqueResult();

[quote=Lucas Cavalcanti]qto tem no total?
vc vai precisar fazer 1 select a mais:

Long totalDeRegistros = session.createQuery("select count(*) from Produto").uniqueResult(); [/quote]

Vlw Lucas.

Tem algum exemplo como implementar a classe paginator post do rodrigo que citei acima ou algo parecido.

Cleison, o post que te falei é esse aqui: http://www.guj.com.br/posts/list/206481.java#1077887

O código fonte está aqui: http://gist.github.com/249508

[quote=garcia-jj]Cleison, o post que te falei é esse aqui: http://www.guj.com.br/posts/list/206481.java#1077887

O código fonte está aqui: http://gist.github.com/249508[/quote]

Importei os fontes… Desculpe a minha insistencia… Como interagir com DAO e Controller e JSP?

Lá no post que te passei o link explica como usar.

[quote=Lucas Cavalcanti]qto tem no total?
vc vai precisar fazer 1 select a mais:

Long totalDeRegistros = session.createQuery("select count(*) from Produto").uniqueResult(); [/quote]

Crie um esse metodo e funciona normal traz o total da lista.

public int getTotalRegistros() {  
		Criteria c = session.createCriteria(Produto.class);  
		c.setProjection(Projections.rowCount());  
		return (Integer) c.uniqueResult();  
	}

Como retornar somente a quantidade de registro pesquisados num metodo de busca list?

Com a quantidade de registros estimada (que vem de getTotalRegistros()), com o número da página atual e com a quantidade de registros por página você consegue calcular o range que você vai exibir.

int currentPage = qual-a-pagina-atual; int perPage = quantidade-de-registros-por-pagina; int totalRecords = getTotalRegistros(); // método que você escreveu acima int firstRecord = (currentPage * perPage) - perPage; int lastPage = new Double(Math.ceil((double) totalRecords / perPage)).intValue();

Agora você já sabe qual o primeiro e último registro que você precisa exibir, basta então fazer a consulta no banco utilizando esses valores:

[code]Criteria c = session.createCriteria(Produto.class);
c.setMaxResults(perPage);
c.setFirstResult(firstRecord);

List produtos = c.getResultList();[/code]

Com a quantidade de registros estimada (que vem de getTotalRegistros()), com o número da página atual e com a quantidade de registros por página você consegue calcular o range que você vai exibir.

int currentPage = qual-a-pagina-atual; int perPage = quantidade-de-registros-por-pagina; int totalRecords = getTotalRegistros(); // método que você escreveu acima int firstRecord = (currentPage * perPage) - perPage; int lastPage = new Double(Math.ceil((double) totalRecords / perPage)).intValue();

Agora você já sabe qual o primeiro e último registro que você precisa exibir, basta então fazer a consulta no banco utilizando esses valores:

[code]Criteria c = session.createCriteria(Produto.class);
c.setMaxResults(perPage);
c.setFirstResult(firstRecord);

List produtos = c.getResultList();[/code][/quote]

Como se aplicaria na seguinte busca?

public List<Produto> busca(String nome,int pagina) {
		
				return session.createCriteria(Produto.class)
				.add(Restrictions.ilike("nome", nome, MatchMode.START))
				.addOrder(Order.asc("nome"))
				.setFirstResult(pagina * 20)
				.setMaxResults(20)
				.list();
			
	}

Você quer que eu programe por você? :twisted:

[code]package com.commons.collections.pagination;

import java.io.Serializable;
import java.util.List;

public class PaginationList implements Serializable {

private static final long serialVersionUID = -7705117997457384895L;

private List<T> list;
private int totalRecords;

public List<T> getList() {
	return list;
}

public void setList(List<T> list) {
	this.list = list;
}

public int getTotalRecords() {
	return totalRecords;
}

public void setTotalRecords(int totalRecords) {
	this.totalRecords = totalRecords;
}

}
[/code]

Implementação.

	protected final PaginationList<T> getPaginationList(TypedQuery query, Integer page, Integer rows) {
		int totalRecords = query.getResultList().size();

		page = page - 1;
		List<T> results = query.setFirstResult(page * rows).setMaxResults(rows).getResultList();

		PaginationList<T> paginationList = new PaginationList<T>();
		paginationList.setTotalRecords(totalRecords);
		paginationList.setList(results);

		return paginationList;
	}

Você quer que eu programe por você? :twisted: [/quote]

Olá garcia só não compreendi como aplicar as intruções que vc me passou, mas desde já agradeço a atenção.

cleison Bom Dia !

Nem você nem eu !

  Junior.