Hibernate Criteria: Comparar datas  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
felipempantoja
JavaTeenager
[Avatar]

Membro desde: 28/11/2007 16:00:37
Mensagens: 167
Localização: Rio de Janeiro
Offline

Olá pessoal
Estou com uma dúvida na utilização de criteria no hibernate. Eu estava usando HQL numa consulta, porém existem muitos filtros opcionais daí eu tinha que ficar criando condição no meio da query e ir dando append numa StringBuffer, aí não fica muito legível dessa forma, além de nada "elegante"

Eis a minha query HQL:



Então, mudando pra criteria seria bem simples, a não ser pelo fato de eu estar comparando as duas datas convertidas pra string no formato dd/MM/yyyy já que a hora é irrelevante pra essa minha consulta, daí não consigo fazer isso usando criteria, seria algo do tipo:


Mas não funciona tentando converter a data dentro dessa restrição aí =/

Alguma sugestão???


"Quer você pense que pode ou que não pode, VOCÊ ESTÁ CERTO!"

Henry Ford
[Email] [Yahoo!] [MSN]
felipempantoja
JavaTeenager
[Avatar]

Membro desde: 28/11/2007 16:00:37
Mensagens: 167
Localização: Rio de Janeiro
Offline

Alguém?

"Quer você pense que pode ou que não pode, VOCÊ ESTÁ CERTO!"

Henry Ford
[Email] [Yahoo!] [MSN]
viniciuspadua
JavaEvangelist
[Avatar]

Membro desde: 25/11/2006 17:21:30
Mensagens: 370
Offline

estava querendo a mesma coisa.
Utilizei o Restrictions.sqlRestriction onde posso passar um comando sql diretamente para a consulta, no meu caso utilizei o código abaixo.



onde "convert(varchar,dtConsulta,103)" é a forma como converto em sql no meu BD (sqlServer).
felipempantoja
JavaTeenager
[Avatar]

Membro desde: 28/11/2007 16:00:37
Mensagens: 167
Localização: Rio de Janeiro
Offline

Show, o único problema é que amarra a consulta a um determinado banco.
Mas aqui isso é o de menos, funcionou legal!

Valeu cara!

"Quer você pense que pode ou que não pode, VOCÊ ESTÁ CERTO!"

Henry Ford
[Email] [Yahoo!] [MSN]
viniciuspadua
JavaEvangelist
[Avatar]

Membro desde: 25/11/2006 17:21:30
Mensagens: 370
Offline

é tem isso!
se resolver se modo sem amarrar ao banco me manda!
flws
ebarros
JavaGuru

Membro desde: 16/01/2008 10:08:54
Mensagens: 230
Offline

Bom como vcs jah disseram isso eh nativo de banco, acredito q usando hql da forma correta seria o mais viável(minha opnião);

Seu campo eh dateTime, ou TimesTamp, ou seja, armazena hora:minuto:segundo tbm? ou eh soh Date? vc pode fazer assim:


Da forma como foi feito acima vc pode inserindo nas suas condições o "?" e setar os parametros de acordo com as suas posições. Não precisa usar o SimpleDateFormat para formatar para dd/MM/yyyy visto que o padrão JDBC eh o formato americano yyyy-MM-dd.


Everton Barros
Fil 4:13 ?Tudo posso naquele que me fortalece?
Javafree
felipempantoja
JavaTeenager
[Avatar]

Membro desde: 28/11/2007 16:00:37
Mensagens: 167
Localização: Rio de Janeiro
Offline

Falae ebarros

Aqui os campos no banco são do tipo timestamp, só que nesse caso específico eu queria simplesmente "ignorar" o time dessas datas, usando o comando to_char do próprio HQL isso resolve o meu problema, o lance seria evitar as condições (se == null) para incluir ou não na query a comparação das datas por exemplo.
Daí achei que usando criteria ficaria mais "elegante" digamos assim, e não uma query quebrada cheia de condições.

De qualquer maneira valeu pela ajuda!

"Quer você pense que pode ou que não pode, VOCÊ ESTÁ CERTO!"

Henry Ford
[Email] [Yahoo!] [MSN]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

felipempantoja wrote:
Então, mudando pra criteria seria bem simples, a não ser pelo fato de eu estar comparando as duas datas convertidas pra string no formato dd/MM/yyyy já que a hora é irrelevante pra essa minha consulta, daí não consigo fazer isso usando criteria, seria algo do tipo:


Mas não funciona tentando converter a data dentro dessa restrição aí =/

Alguma sugestão???



como eu axo criteria mais legal, mesmo vendo que vc fez com HQL, que ainda por cima usa coisa nativa da base de dados... segue uma solução com Criteria...



Ou seja, ele vai buscar o valores da date entre... 00h:00m:00s e 000ms e 23h:59m:59s e 999ms ... em resumo, vai encontrar qualquer valor igual a apenas o dia, não conciderando Times....

segue o trecho usado da classe DateUtils

sei que a principio pode parecer uma solução muito extensa, mais veja que não é...

DateUtils é uma classe utilitaria, e esse código pode ser reusado a qualquer momento no seu projeto....

então o código resumes a invocar... DateUtils.highDateTime(Date) e DateUtils.lowDateTime(Date)

espero que te ajude

This message was edited 4 times. Last update was at 08/04/2009 22:03:15


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
felipempantoja
JavaTeenager
[Avatar]

Membro desde: 28/11/2007 16:00:37
Mensagens: 167
Localização: Rio de Janeiro
Offline

Lavieri,

Show, e nem é extenso, ficou muito bom, eu estava tentando sempre converter a data pra eliminar as horas, mas com a classe utilitária isso resolve o meu problema sem precisar usar query nativa ou um HQL todo quebrado. Muito bom!

Obrigado a todos

Aproveitando...
Sabe se existe alguma coisa no criteria pra incluir uma condição no where somente se o parâmetro não for null?
Daí eu evito if/else no criteria tb

Abraços!

"Quer você pense que pode ou que não pode, VOCÊ ESTÁ CERTO!"

Henry Ford
[Email] [Yahoo!] [MSN]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

felipempantoja wrote:Aproveitando...
Sabe se existe alguma coisa no criteria pra incluir uma condição no where somente se o parâmetro não for null?
Daí eu evito if/else no criteria tb

Abraços!


Se o campo "e.name" for nulo ou se o cmapo "e.name" não for nulo

Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
felipempantoja
JavaTeenager
[Avatar]

Membro desde: 28/11/2007 16:00:37
Mensagens: 167
Localização: Rio de Janeiro
Offline

Lavieri,

Valeuuu cara, vou testar e posto aqui já!

"Quer você pense que pode ou que não pode, VOCÊ ESTÁ CERTO!"

Henry Ford
[Email] [Yahoo!] [MSN]
paribe
JWizard
[Avatar]

Membro desde: 22/08/2004 07:34:33
Mensagens: 2057
Offline

Duvida quando uso

um campo data onde quero que esse campo seja >=

e no banco de dados esse campo foi gravado com horário

e ao consultar na tela é solicitado uma data informo "01/02/2009" --> dataIn


e existe outro campo data final onde digito informo "31/12/2009" -->dataFin


não volta o registro pois no banco o :

campo data_start ---> "01/02/2009 12:12:09"
campo data_start ---> "31/12/2009 13:10:09"


alguém poderia me ajudar .....



Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

baixa o arquivo que coloquei aki o DataUtils, e usa assim

[ICQ]
paribe
JWizard
[Avatar]

Membro desde: 22/08/2004 07:34:33
Mensagens: 2057
Offline

Olá,

duvida usando sua rotina quando
monto criteria usando "=" não encontra o registro abaixo ?????








Kleber-rr
Virtual Machine Man
[Avatar]

Membro desde: 02/07/2009 12:12:02
Mensagens: 664
Offline

Olá pessoal, estou com um problema tb na questão de converter de Date para String... tenho mto pouco conhecimento em criteria e estou fazendo ela assim:


Só que me dá o seguinte erro:

Se alguem puder ajudar, agradeço!!
Flws

 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team