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
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 mas como eu erroniamente colocoi one-to-one
Agora ta funcionando sem eu precisar usar o FetchMode
A resposta de sua pergunta eh:
Java eh orientado a strings ou a objetos?