Hibernate -> CreateQuery vs CreateCriteria

14 respostas
passos

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

14 Respostas

Rodrigo_Carvalho_Aul

: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.

passos

Com createCriteria e possivel fazer algo com:

:?:

Rodrigo_Carvalho_Aul

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.

passos

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

Rodrigo_Carvalho_Aul

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

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

[]'s

Rodrigo C. A.

passos

Pre quem tinha a curiosidade de ver como ficaria isso:

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

C

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

Mauricio_Linhares

passos:
Pre quem tinha a curiosidade de ver como ficaria isso:

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

Essa query em Criteria funcionou? Você testou ela?

_fs

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.

passos

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);
_fs

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?

passos

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

Guilherme_Silveira

A resposta de sua pergunta eh:

Java eh orientado a strings ou a objetos?

jack_ganzha

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

valeuz…

Criado 16 de julho de 2005
Ultima resposta 20 de jul. de 2005
Respostas 14
Participantes 7