Hibernate - Consulta genérica com filtros diversos

8 respostas
M

Pessoal, estou com uma dúvida usando hibernate.

Tenho uma tela de Clientes composta por campos que representam dados dos clientes da minha aplicação, por exemplo, código, nome, cpf, cidade, sexo, etc.

Caso o usuário do sistema queira consultar clientes, ele pode preencher qualquer destes filtros e, em seguida, clicar num botão consultar para a aplicação consultar todos os clientes com base nos filtros informados.

No hard-coding, deveríamos fazer vários if(), else if() , else if() para verificar quais campos da tela foram preenchidos e, quando estes fossem, criarmos um “AND” num comando SQL para cada um destes filtros.

Porém eu não gostaria que a consulta fosse feita desta forma e acredito que o hibernate forneça algum modo de fazer isso de uma forma melhor.

Alguém pode me ajudar? Alguém sabe como?

Desde já agradeço.

8 Respostas

P

Olá amigo, pesquise sobre a Criteria do Hibernate OK!

Com ela vc pode passar varios ou um parametro e o resto ela mesmo faz…

Fallow

M

Eu pesquisei, mas os exemplos que encontrei não davam a ideia disso.
Mas vou ver se consigo aqui.

Valeu!!!

P

Veja isto:
http://jmmwrite.wordpress.com/category/criteria/

Outra solução seria:

se vc tem um form de perquisa ou filtro…vc pode ter um bean que recebe os parametros desse form

vc poderia verifiar os parametros que foram “setados” ou seja que não são nulos e adicionar a sua Criteria com o Criterion veja:

Criteria criteria = getSession.createCriteria(Cliente.class); // pesquisa clientes..

Criterion parametroNome = Restrictions.like("cliente.nome",nomePesquisado); // se digitou nome do cliente na pesquisa, adiciono na criteria 

criteria.add(parametroNome );

return criteria.list(); //retorna resultados semelhantes a sql select * from Clientes c where c.nome like nomePesquisa%;

Eu seguiria dessa forma…
Espero ter ajudado
Fallow

M

Ajudou, amigo!
Ajudou muito.

valeu

A

Galera com fazer uma pesquisa generica usando criteria like??
a pesquisa seria essa, ele funciona normalmente só precisaria transformar em um
método genérico.

public List<Usuario> listarUsuarioLikeNome(String texto) {
		sessao = HibernateUtil.currentSession();
		tx = sessao.beginTransaction();

		Criteria criteira = sessao.createCriteria(Usuario.class).add(
				Restrictions.ilike("nome", "texto%"));

		List<Usuario> resultados = criteira.list();

		if (resultados == null) {
			JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
		}

		sessao.close();

		return resultados;
	}
J
AdsMarcos:
Galera com fazer uma pesquisa generica usando criteria like?? a pesquisa seria essa, ele funciona normalmente só precisaria transformar em um método genérico.
public List<Usuario> listarUsuarioLikeNome(String texto) {
		sessao = HibernateUtil.currentSession();
		tx = sessao.beginTransaction();

		Criteria criteira = sessao.createCriteria(Usuario.class).add(
				Restrictions.ilike("nome", "texto%"));

		List<Usuario> resultados = criteira.list();

		if (resultados == null) {
			JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
		}

		sessao.close();

		return resultados;
	}
O que você quer dizer com pesquisa genérica exatamente? Se está falando da query ser dinamica seria isso:
Criteria c = sessao.createCriteria(Usuario.class);
  
if (nome != null && nome.length() > 0)
{
  c.add(Restrictions.ilike("nome", nome + "%"));
}
Não entendi a necessidade do beginTransaction, isto é só uma consulta.
A

Genereico que eu estou falando seria por exemplo:

public List<T> listarUsuarioLikeNome(String texto) {  
    sessao = HibernateUtil.currentSession();  
    tx = sessao.beginTransaction();  
  
    Criteria criteira = sessao.createCriteria(Class<?>).add(  //ESSE TIPO ASSIM
            Restrictions.ilike("nome", "texto%"));  
  
    List<Usuario> resultados = criteira.list();  
  
    if (resultados == null) {  
        JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");  
    }  
  
    sessao.close();  
  
    return resultados;  
}

USANDO EM VEZ DE UMA CLASSE DEFINIDAS, USAR TIPOS GENÉRICOS PARA
QUE EXISTAM SOMENTE EM TEMPO DE EXECUÇÃO OU QUANDO FOR INSTANCIADO.

D

Normalmente, eu faço assim:

/*
    Os argumentos são:
    @param clazz: Classe que será a base da consulta.
    @param params: HashMap&lt;String, Object&gt; que tem como key (chave) o nome da propriedade e como value (valor) o objeto a ser utilizado como filtro.
*/
public List&lt;?&gt; findByCriteria(Class&lt;?&gt; clazz, Map&lt;String, Object&gt; params){
    Criteria criteria = session.createCriteria(clazz);

    Iterator&lt;String&gt; keys = params.keySet().iterator();
    
    while(keys.hasNext()){
        String key = keys.next();
        Object param = params.get(key);

        if(param instanceof String){
            criteria.add(Restrictions.ilike(key, "%" + param + "%");
        }else{
            criteria.add(Restrictions.equals(key, param);
        }
    }
    List&lt;?&gt; lista = criteria.list();
    return lista;
}
Criado 14 de setembro de 2011
Ultima resposta 16 de jan. de 2013
Respostas 8
Participantes 5