[RESOLVIDO] Problemas com paginação de resultados: SQL com Order e Between

6 respostas
Marky.Vasconcelos

Não conhecia o LIMIT
Mas quem procurar a solução com hibernate

Criteria crit = session.createCriteria(clazz);   
        crit.addOrder(order);   
        crit.setFirstResult(first);   
        crit.setMaxResults(maxResult);   
        List<?> list = crit.list();

ty all

[RESOLVIDO]
Olá…

Eu andei trabalhando em um paginador de listas para as minhas tabelas e consegui chegar nisso.

package mark.utils.list;

import java.util.List;

public class ListPaginator<T> {
	private List<T> list;
	protected int currentPagination, maxPage, pageResults;
	protected int listSize;

	protected ListPaginator(int listSize, int resultsPerPage) {
		pageResults = resultsPerPage;
		this.listSize = listSize;
		currentPagination = 0;

		if (pageResults == 0)
			return;
		if (listSize % pageResults == 0)
			maxPage = listSize / pageResults - 1;
		else
			maxPage = listSize / pageResults;
	}

	public ListPaginator(List<T> list, int resultsPerPage) {
		this.list = list;
		pageResults = resultsPerPage;
		currentPagination = 0;
		if (pageResults == 0)
			return;
		if (list.size() % pageResults == 0)
			maxPage = list.size() / pageResults - 1;
		else
			maxPage = list.size() / pageResults;
	}

	public List<T> nextResult() {
		int toIndex = 0;

		toIndex = (currentPagination + 1) * pageResults;

		if (toIndex > list.size())
			toIndex = list.size();
		List<T> list = this.list.subList(currentPagination * pageResults,
				toIndex);

		currentPagination++;
		return list;
	}

	public int getCurrentPage() {
		return currentPagination;
	}

	public void setCurrentPage(int page) {
		currentPagination = page;
	}

	public int getMaxPage() {
		return maxPage;
	}

}
O problema é… agora que os resultados no banco são mais de 1000 e crescendo ter que carregar a lista e pagina-la vai ficando mais demorado.

Então eu pensei em criar outro Paginator com meu DAO.

E criei isso:

public DaoListPaginator(DAO<T> dao, Order order, int resultsPerPage) {

super(dao.getListSize(), resultsPerPage);
this.dao = dao;   
}

Agora a performance melhorou bastante nas telas de seleção.

Meu problema agora é: Quero deixar a lista ordenada por outra coluna e paginada.
Espero algo mais ou menos assim:

[id:character]
1:c
2:d
3:a
4:h
5:g
6:f
7:b
8:e
9:i

Quero com um select entre os indices 2 e 5 pegar assim:

[id:character]
3:a
7:b … 2
1:c …3
2:d …4
8:e …5
6:f
5:g
4:h
9:i

É possivel fazer isso com Hibernate? Ou então com SQL mesmo?

ty all

6 Respostas

F

É mysql?

Marky.Vasconcelos

Sim.

F

Então no mysql existe o comando limit:
SELECT * FROM tabela LIMIT 5,5

Pega da posição 5 e avança mais 5. Creio que se vc ordenar a pesquisa e usar o limit vai conseguir.

Obs.: Se eu entendi direito seu problema, fiquei meio confuso :lol:

Marky.Vasconcelos

Se voce entendeu como ficou confuso? xD

Apareceu outra coisa para fazer mas daqui a pouco eu testo.

Obrigado.

Marky.Vasconcelos

Minha classe DaoListPaginator ficou assim

package br.com.genesis.util;

import java.util.List;

import org.hibernate.criterion.Order;

import br.com.genesis.database.dao.DAO;

import mark.utils.list.ListPaginator;

public class DaoListPaginator<T> extends ListPaginator<T> {

	private DAO<T> dao;
	private Order order;

	public DaoListPaginator(DAO<T> dao, Order order, int resultsPerPage) {
		super(dao.getListSize(), resultsPerPage);

		this.dao = dao;
	}

	@Override
	public List<T> nextResult() {
		int toIndex;

		toIndex = (currentPagination + 1) * pageResults;

		if (toIndex > listSize)
			toIndex = listSize;
		
		
		List<T> list = dao.getListByLimit(order, currentPagination
				* pageResults, toIndex);

		currentPagination++;
		return list;
	}
}

Mas quando esse código é executado:

//Método da classe DAO
public List<E> getListByLimit(Order order, int first, int last) {
		Criteria crit = s.createCriteria(clazz);
		crit.addOrder(order);
		crit.setFirstResult(first);
		crit.setMaxResults(last - first);
		return crit.list();
	}

Lança a seguinte Exception.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getOrderBy(CriteriaQueryTranslator.java:348)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:90)
	at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:59)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at br.com.genesis.database.dao.DAO.getListByLimit(DAO.java:145)
	at br.com.genesis.util.DaoListPaginator.nextResult(DaoListPaginator.java:45)
	at mark.utils.swing.table.SelectTable.<init>(SelectTable.java:50)
	at br.com.genesis.gui.CotacaoGUI.choose(CotacaoGUI.java:461)
	at br.com.genesis.gui.Genesis$MainMenuBar.actionPerformed(Genesis.java:208)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
Marky.Vasconcelos

-.-

Esqueci de atribuir o valor do parametro order do construtor pra variavel =/

public DaoListPaginator(DAO<T> dao, Order order, int resultsPerPage) {   
        super(dao.getListSize(), resultsPerPage);   
  
        this.order = order;//Só falto isso =/
        this.dao = dao;   
    }
Criado 27 de novembro de 2008
Ultima resposta 27 de nov. de 2008
Respostas 6
Participantes 2