Hibernate - anular criterios onde o parametro seja null

Olá, como faço no hibernate usando a Criteria API, para quando um parametro seja null, o criteria não testar aquela condição?

E uma duvida a respeito de fetchmode com join e createalias. Ambos carregam a coleção, a unica diferenca é que o createalias define um nome para a propriedade?

Grato,
Thiago

Você pode utilizar o excludeZeroes()

Abaixo um exemplo retirado da documentação online do hibernate

Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color")  //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
    .add(example)
    .list();

.excludeZeroes() eu também vi, mais como está dizendo é para excluir Zero e não Null, não tenho como testar aqui agora, amanha vou testar para ver se funciona para null também, você já estou isso ai?

mensagem incorreta

Só a outra duvida grande, tanto o fecth join como o create alias, carrega a coleção antes, adiantada?

Sim!

Ae, estou tentando usar esse .excludeZeroes() , porém ele não está me atendendo.

Tenho o seguinte codigo


LocalizacaoVO pLocalizacao = new LocalizacaoVO();
		pLocalizacao.setQuadra("b");
		pLocalizacao.setLote( lote ); //sendo que lote eu setei o codigo

Example example = Example.create(pLocalizacao)
	     .excludeZeroes()          
	     .ignoreCase()         
	     .enableLike(MatchMode.START);
		 
	      Criteria select = sessao.createCriteria(pLocalizacao.getClass())
		.add(example)
		.createAlias("lote","lote");

dessa forma ele não está verificando a foreign key, ta simplesmente ignorando, só está testando o where para a Quadra

E quando eu adiciono

     .setFetchMode("lote",FetchMode.JOIN)
     .add(Restrictions.eq( "lote.codigo" , lote.getCodigo() ) )

ele limita sempre, até se o codigo de lote for null.

Não tem como eu setar o fetch no example, ou setar o ExcludeZeroes no createCriteria?

Grato,
Thiago

[quote=diogoj]na documentação

Example example = Example.Create(cat)
    .ExcludeZeroes()           //exclude null or zero valued properties
    .ExcludeProperty("Color")  //exclude the property named "color"
    .IgnoreCase()              //perform case insensitive string comparisons
    .EnableLike();             //use like for string comparisons
IList results = session.CreateCriteria(typeof(Cat))
    .Add(example)
    .List();

exclude null or zero valued properties

boa sorte[/quote]

cara, essa documentacao que você está vendo é para o NHibernate, para o .net.
Olhe a documentação correta.

Na documentação do hibernate para java, e na api cod tem:

api doc
http://www.hibernate.org/hib_docs/v3/api/


excludeZeroes

public Example excludeZeroes()

    Exclude zero-valued properties

documentacao
http://www.hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html


Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color")  //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
    .add(example)
    .list();

Documentação do NHibernate:

Documentação do Hibernate:

Queria que me exclarecessem uma coisa.

Tenho um relacionamento de localização com lote, onde 1 lote tem N localizações e 1 localização pertence a um lote. Porém esse relacionamento pode ser null, ou seja, a localização não precisamente precisa de um lote.

Com isso eu tenho uns criterios de busca, onde eu vou trago todas as coleções que tem 1 lote, porém quando esse lote é nulo não está trazendo nada.

Tentei fazer dessa forma

Criteria select = sessao.createCriteria(Localizacao.class)
			.createAlias("lote","lote")	
			.add(Restrictions.eq( "lote.codigo" , localizacao.getLote().getCodigo() )
                        .list();
Criteria select = sessao.createCriteria(Localizacao.class)
			.add(example)	
			.list();

onde no example eu passava um objeto Localizacao que tinha o lote com o codigo setado e defini .excludeZeroes() no example.

terminei que só conseguir da seguinte forma:

Criteria select = sessao.createCriteria(Localizacao.class)
			.createAlias("lote","lote");
if(localizacao.getLote().getCodigo()  != null){
	criteria.add(Restrictions.eq( "lote.codigo" , localizacao.getLote().getCodigo() );
}

List list = criteria.list();

Não sei se essa é a melhor forma de fazer, está parecendo armengue. Teria outra forma?