Criteria do Hibernate - Annotations

Estou fazendo uma consulta usando o criteria do hibernate 3.6:

        Criteria crit = getSession().createCriteria(ParametrizacaoEntity.class);
        crit.setFetchMode("produtoRegua", FetchMode.JOIN);
        Criterion codProd = Restrictions.eq("id.Prod", parametrizacao.getId().getCodProduto());
        Criterion codGrupo = Restrictions.eq("id.iGroup", parametrizacao.getId().getIdGrupo());
        Criterion nomeCampo = Restrictions.eq("id.nameField", parametrizacao.getId().getNomeCampo());
        Criterion nomeTabela = Restrictions.eq("id.tableName", parametrizacao.getId().getIdTabela());
        
        if(parametrizacao.getId().getCodProduto() != null){
        	crit.add(codProd);
        }
        if(parametrizacao.getId().getIdGrupo() != null){
        	crit.add(codGrupo);
        }
        if(parametrizacao.getId().getNomeCampo() != null){
        	crit.add(nomeCampo);
        }
        if(parametrizacao.getId().getIdTabela() != null){
        	crit.add(nomeTabela);
        }
        List<ParametrizacaoEntity> lista = crit.list();

Se eu não tratar o campo do objeto passado como parâmetro se é nulo, ele está montando a query utilizando o mesmo. Por exemplo, codProd posso passar o parâmetro do objeto como null, seria interessante o hibernate ignorar o parâmetro não o adicionando a query, o que não está ocorrendo. A query está sendo montada como codProd == null, trazendo os dados errados. Existe alguma configuração para que os parâmetros informados como null sejam ignorados no criteria, nesse caso minha consulta ficaria assim:

        Criteria crit = getSession().createCriteria(ParametrizacaoEntity.class);
        crit.setFetchMode("produtoRegua", FetchMode.JOIN);
        Criterion codProd = Restrictions.eq("id.Prod", parametrizacao.getId().getCodProduto());
        Criterion codGrupo = Restrictions.eq("id.iGroup", parametrizacao.getId().getIdGrupo());
        Criterion nomeCampo = Restrictions.eq("id.nameField", parametrizacao.getId().getNomeCampo());
        Criterion nomeTabela = Restrictions.eq("id.tableName", parametrizacao.getId().getIdTabela());
        
                //caso os parâmetros sejam null o critério seria ignorado, não sendo necessário tratá-los.
        	crit.add(codProd);
        	crit.add(codGrupo);
        	crit.add(nomeCampo);
        	crit.add(nomeTabela);

        List<ParametrizacaoEntity> lista = crit.list();

Opa, blza

Quando eu trabalho com criteria eu faço assim


Criteria crit = HibernateFactory.getSession().createCriteria(Fornecedor.class);

crit.add(Restrictions.like("nome","%"+nome+"%"));

if (codCidade !=null){
    crit.add(Restrictions.eq("codCidade",codCidade));
}

onde o primeiro argumento do Restriction é o nome do atributo e o segundo o valor passado por parametros, dessa forma a comparação de null funciona, e só adiciona a restriction se realmente não tiver nulo.
A impressão que tive é que da forma que vc fez ele adiciona de qualquer jeito, sei lá, vc faz um pouco diferente não sei se tem algo a ver. rsss

Não conheço nenhuma configuração para isso, utilizo Restrictions.isNotNull, não sei se ajuda …

[]'s

eu criei um proj. para trabalhar com criteria de forma mais dinamica, se alguem interessar de uma olhada.
http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate

tive esse problema mês passado, utilizei o mesmo raciocínio do igor_henrique:

criar o Criteria
verificar se tal dado é nulo

se falso, pode incluir no Criteria
outras restriçoes da consulta
chamada ao método list()

O tópico é um pouco antigo mas acho que é o lugar correto para tirar a dúvida.

Eu tenho uma classe que é mapeada de uma tabela. Essa classe tem um relacionamento com outra tabela, também mapeada.

Então temos que a ClasseA se relaciona com a ClasseB. No Java, a ClasseA tem um objeto da ClasseB. Estou lendo sobre o uso de Criteria e sempre vejo usarem um campo da classe.

Por exemplo, se eu quiser um Criteria da ClasseA, eu utilizo o campo dela session.createCriteria(ClasseA.class).add(Restrictions.in(“meuCampo”, meusCriterios));

Mas como posso utilizar Criteria se eu quiser pesquisar um campo da ClasseB, que está dentro da ClasseA? PAsa ser um pouco mais claro…


ClasseA {

     String    campo1;
     String    campo2;
     ClasseB minhaClasseB;

}

ClasseB {

    String campo4;
    String campo5;

}

OS exemplos de Criteria que encontro são utilizando Objetos da própris ClasseA. Como faço para pesquisar uma consulta que traz objetos da ClasseA, só que usando um Criteria que filtre um campo da ClasseB que está dentro da ClasseA?

Mais ou menos algo como:
session.createCriteria(ClasseA.class).add(Restrictions.in(“minhaClasseB.nome”, criterios));

[EDIT:] Acabei de perceber
oooooooooooooooopppsssssss!!!

Ao invés de procurar pelo campo identificador da ClasseB, é só usar o próprio objeto da ClasseB no Criteria hehehehehehe.