Vraptor + Hibernate + Paginação

39 respostas
C

Olá pessoal

Estou com dificuldade de fazer paginação.

Estou usando displaytag para listar.

Alguém!

39 Respostas

R

vc já colocou o atributo “pagesize”?

ex:

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

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

C

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

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?

Lucas_Cavalcanti

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

Guevara

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

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

Abraço!

G

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.

C

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();  
	}
Lucas_Cavalcanti

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

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

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

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

Vlw Lucas.

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

G

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

C

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

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

G

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

C

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

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

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?

G
cleison:
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:

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

List<Produto> produtos = c.getResultList();
C
garcia-jj:
cleison:
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:

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

List<Produto> produtos = c.getResultList();
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();
			
	}
G

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

bruno.costa
package com.commons.collections.pagination;

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

public class PaginationList<T> 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;
	}
}
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;
	}
C

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

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

juniorsatanas

cleison Bom Dia !

Nem você nem eu !

Junior.
juniorsatanas

bruno.costa Bom dia !

Obrigado, vou tentar seguir seu código, que ficou muito legível !

Abraço !

bruno.costa

Olá, eu implementei também um objeto builder para ser utilizado na geração de json ou xml para grid’s, tem exemplo de como utilizar também.

segue o link.

juniorsatanas

CABRA DA PESTE, DA GOTA SERENA ! AFF CRUZ CREDO !

Valeeuuuuuuuuuuuuuu d + BRUNAOOOOOOOOOOOOOOOOOOOOOOOOOOOOO !

bruno.costa

exemplo de uso.

https://github.com/brunocosta/EasyGridAjaxObject/blob/master/src/com/cocento/commons/ajax/easygrid/demonstration/Main.java

Lucas_Cavalcanti

bruno, a gente pode divulgar o seu plugin na página do vraptor?

juniorsatanas

Bruno ficou muio bom !

run: {"page":0,"total":1,"records":2,"itensPerPage":10,"rows":[["Class B","Test String","Object 1","999","06/12/2010","06/12/2010 13:20","200","R$ 999,99","$999.99"],["Another Class B","Test String Object 2","Object 2","500","06/12/2010","06/12/2010 13:20","400","R$ 5.900,99","$5,900.99"]]} CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

bruno.costa

pode sim, estou realizando algumas melhorias nele, terminar de implementar os testes e aceito sugestões (favor criar uma issue no github).

é bom ter mais gente testando…

abraço

juniorsatanas

bruno.costa

Tu ta usando isso no teu sistema já ?

bruno.costa

juniorsatanas:
bruno.costa

Tu ta usando isso no teu sistema já ?

estou sim, e fizemos um plugin grid pra jQuery bem simples e leve (90% das vezes não utilizamos tudo o que os outros plugins fazem), tem paginação, ordenação e i18n, ele na versão com compressão pesa 8.4k, depois vou publicar ele também.

juniorsatanas

8.4k ? Então ficou ideal pra mim mano !

Estou no aguardo Valeu mesmo Mano !

bruno.costa

juniorsatanas:
8.4k ? Então ficou ideal pra mim mano !

Estou no aguardo Valeu mesmo Mano !

kra esqueci de mandar na implementação o método que eu fiz pra ordernar a query utilizando o plugin do grid

/**
	 * Método responsável por completar a query com o orderby
	 * 
	 * @param jpaQuery
	 *            <p>
	 *            Alias da query deve ser sempre i
	 *            </p>
	 * @param orderBy
	 * @return
	 */
	protected final String buildOrderbyQuery(String jpaQuery, String orderBy) {
		StringBuilder builder = new StringBuilder();

		builder.append(jpaQuery);

		if (!(orderBy == null || orderBy.isEmpty())) {
			builder.append(" order by ");
		}
		int i = 0;
		for (String order : orderBy.split(",")) {
			if (i &gt; 0) {
				builder.append(",");
			}
			builder.append("i.");
			builder.append(order);
			i++;
		}

		return builder.toString();
	}
bruno.costa

Lucas eu mudei o nome do meu git pra ficar no padrão de twitter, blog, email etc.

segue.

Lucas_Cavalcanti

blz =)

juniorsatanas

Bruno mas teve modificação no código ?

bruno.costa

Foi alterada a forma usar reflection, alteração sugerida pelo lucas

https://github.com/brunoadacosta/EasyGridAjaxObject/commit/e5569da46b3eccd9f2efdc103b7482745515f347

próximo update será, adicionar o plugin grid e depois um blank project do vRaptor com o nosso plugin grid jQuery.

juniorsatanas

Já temos muita coisa ! isso que vc ta fazendo é uma das mais importantes !

Ajax com combo
Relatŕorio e Boleto bancário
Controle de usuário com Spring Security
Agora a paginação !

etc…

Não vou ter motivo par ausar JSF…

Valeu !

bruno.costa

juniorsatanas:
Já temos muita coisa ! isso que vc ta fazendo é uma das mais importantes !

Ajax com combo
Relatŕorio e Boleto bancário
Controle de usuário com Spring Security
Agora a paginação !

etc…

Não vou ter motivo par ausar JSF…

Valeu !

kra eu subi outro projetinho lá, esse é uma alteração do SiteMesh, para fazer navegação ajax estilo facebook

exemplo

em uma requisição assincrona ele retorna um json no seguinte formato

ele recorta o html usando ER e se existirem js inline ele comprime e coloca no js:code, se for um arquivo.js ele coloca no code:src e assim também pra css.

se a pessoa não utilizar requisição assíncrona ele não aplica o filtro, motores de busca vão indexar sua aplicação.

vou colocar também um blank project com vRaptor utilizando o filtro, só não posso dar prazo rsrs

juniorsatanas

Baixei já, vou da uma estudada !

Obrigado !

bruno.costa

juniorsatanas:
Baixei já, vou da uma estudada !

Obrigado !

Junior, ta usando alguma das implementações? encontrou bugs? sugestões ?

abraço :stuck_out_tongue:

juniorsatanas

bruno.costa Boa Tarde !

A paginação estou estudando ela, achei uma ótima idéia… e outra não existe nada disso na net sobre paginação e Vraptor ! mas até agora não conseguir por para rodar no meu projeto !

Mas a briga continua …

Grande abraço Bruno !

jr

Criado 21 de outubro de 2010
Ultima resposta 10 de dez. de 2010
Respostas 39
Participantes 7