Hibernate -> CreateQuery vs CreateCriteria

Quando e porque você utiliza CreateQuery ao inves de CreateCriteria e vice e versa?

:arrow: CreateQuery: quando a minha query tem parametros fixos.
:arrow: CreateCriteria: quando a minha query tem parâmetros variáveis, por exemplo quando os parametros variam de acordo com o que o usuário preencheu num formulário de pesquisa.

[]'s

Rodrigo C. A.

Com createCriteria e possivel fazer algo com:

:?:

Não… a função do CreateCriteria é outra, é criar query dinâmica… você não passa uma query pronta pra ele, vc monta a query através dos métodos da interface Criteria…

[]'s

Rodrigo C. A.

Não a minha duvida nao e sobre poder passar uma query pra ele e sim poder pesquisar subniveis:

Ah tá… até dá… mas é chato

Por isso que prefiro concatenar string pra montar a query e usar o CreateQuery…

[]'s

Rodrigo C. A.

Pre quem tinha a curiosidade de ver como ficaria isso:

createCriteria("Item.class"); .add( Restrictions.between("venda.data", Object Date, Object Date) );

Tipo, acho que o melhor mesmo é usar namedQuerys, assim você tira os códigos HQL de dentro do aplicacao…

[quote=passos]Pre quem tinha a curiosidade de ver como ficaria isso:

createCriteria("Item.class"); .add( Restrictions.between("venda.data", Object Date, Object Date) );[/quote]

Essa query em Criteria funcionou? Você testou ela?

No Hibernate 2.x é um pouco mais chato para acessar objetos de relacionamento em Criterias. Há dois jeitos:

session.createCriteria( Item.class ).createAlias( "venda", "venda" ).add( Expression.between( "venda.data", dataInicial, dataFinal ) );

ou

session.createCriteria( Item.class ).createCriteria( "venda", "venda" ).add( Expression.between( "data", dataInicial, dataFinal ) );

Mas a grande porcaria mesmo é não poder fazer um simples count(*) usando Criteria no Hibernate 2.x. Arrumaram ambos os problemas no 3.x.

Como disseram, é bom usar queries em consultas com filtros pré-definidos, opis o Hibernate faz o cache destas queries. Para todo o resto prefiro Criteria infinitamente, bem melhor do que ficar caçando Strings.

Esqueci do createCriteria :slight_smile:

Se por acaso minha classe venda (do exemplo acima) tivesse um relacionamento de M -> 1 como eu faria para ele nao iniciar essa parte 1

Ex: Minha venda (dentro de item) tem um Cliente porem eu nao quero ele inicie esse Cliente.

Tentei usar FetchMode mas não funcionou:

Criteria c = s.createCriteria(VendaItem.class)
		 
.createCriteria( "venda", "v" )
.add( Restrictions.between("v.data", dtini, dtfim) )
		 
c.setFetchMode("v.cliente", FetchMode.LAZY);

Se você usa createCriteria ao invés de createAlias não é necessário colocar o alias, pois tudo o que vier depois da segunda criteria será referente ao relacionamento. Ficaria algo como:

Criteria c = s.createCriteria(VendaItem.class)
    .createCriteria( "venda", "v" )
    .add( Restrictions.between("data", dtini, dtfim) ) //referente a venda
    .setFetchMode("cliente", FetchMode.LAZY); // referente a venda

E você está usando Hibernate 3.x, não? Tem certeza que é necessário fazer isso?

Sim! :mrgreen:

Se eu tivesse mapeado ele corretamente como many-to-one não :stuck_out_tongue: mas como eu erroniamente colocoi one-to-one :stuck_out_tongue:

Agora ta funcionando sem eu precisar usar o FetchMode

A resposta de sua pergunta eh:

Java eh orientado a strings ou a objetos?

Um bom artigo sobre Criteria API:
http://www.javalobby.org/articles/hibernatequery102/

valeuz…