| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2009 12:33:41
|
alancq
Entusiasta Java
Membro desde: 21/08/2008 14:21:46
Mensagens: 23
Offline
|
Alguém saberia me dizer como se pode adicionar/subtrair intervalos de data com HQL ou Criteria? Tentei usar a função date_add e date_sub (ex.: date_sub(foo.data, 2 day)), mas o hibernate (usando Postgresql 8.3) está lançando a exceção: "... org.hibernate.hql.ast.QuerySyntaxException: unexpected token: day near line 1, column 219 ..."
Quero fazer algo do tipo:
Alguém sabe como fazer isso?
This message was edited 2 times. Last update was at 04/05/2009 05:51:07
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2009 12:59:58
|
thiago.correa
GUJ Master
![[Avatar]](/images/avatar/c37f9e1283cbd4a6edfd778fc8b1c652.jpg)
Membro desde: 26/03/2006 18:54:30
Mensagens: 1861
Offline
|
Porque você não faz a operação antes de passar para o hibernate?! Ou precisa ser necessariamente feito no lado do banco?!
|
---
"Se não puder ajudar, atrapalhe, afinal de contas o importante é participar!"
Thiago
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2009 13:21:53
|
alancq
Entusiasta Java
Membro desde: 21/08/2008 14:21:46
Mensagens: 23
Offline
|
Por motivo de performance. Se eu fizer a operação com a data fora da consulta, terei que fazer várias consultas ao banco (uma para cada data que eu calcular "do lado de fora")...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/04/2009 14:19:29
|
thiago.correa
GUJ Master
![[Avatar]](/images/avatar/c37f9e1283cbd4a6edfd778fc8b1c652.jpg)
Membro desde: 26/03/2006 18:54:30
Mensagens: 1861
Offline
|
Você quer pesquisar um intervalo de datas?! Se não for, coloca aí o que você pretende fazer!
|
---
"Se não puder ajudar, atrapalhe, afinal de contas o importante é participar!"
Thiago
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/04/2009 08:24:14
|
alancq
Entusiasta Java
Membro desde: 21/08/2008 14:21:46
Mensagens: 23
Offline
|
Preciso testar melhor, mas parece que consegui resolver o meu problema.
Vou tentar resumir meu problema.
O sistema que estou implementando precisa fazer "Lancamentos de Crédito" (Class LancamentoCredito (na verdade é LancamentoCreditoTarifado, mas vamos ignorar esse sufixo)) em uma determinada conta (Class BancoConta).
Cada LancamentoCredito está associado (@ManyToOne) a uma "Vigência Tarifária" (Class VigenciaTarifaria), ou seja, um LancamentoCredito possui 1 única VigenciaTarifaria e 1 VigenciaTarifaria pode ter vários LancamentoCredito's.
LancamentoCredito também possui 1 campo BigDecimal chamado "valor", 1 campo BancoConta chamado "conta" e 1 campo CreditoTipo chamado "creditoTipo" (que representa o tipo de lançamento, DAC, TED, DOC, Home Banking, etc...).
Essa VigenciaTarifaria possui um campo int chamado "floatDias". Esse floatDias representa o D+floatDias que o crédito lançado realmente entrará na conta.
Em um certo relatório, eu preciso saber o "Total de Créditos" que será transferido para uma determinada BancoConta, de um determinado CreditoTipo, entre o intervalo de datas dataInicial e dataFinal.
Se o floatDias fosse sempre o mesmo, isso seria facilmente resolvido. Por exemplo, se o floatDias fosse SEMPRE igual a "2" e eu quisesse saber o total de créditos que entrou em uma conta, entre o dia 16/04/2009 e 30/04/2009:
Calcularia a dataIni e a dataFim "por fora" (com a classe GregorianCalendar), resultando dataIni = 14/04/2009 e dataFim = 28/04/2009 e executaria a consulta hql:
Acontece que o floatDias pode variar durante o período selecionado. Por exemplo, do dia 16/04/2009 ao dia 20/04/2009 floatDias pode ser 2, e a partir do dia 21/04 até o dia 30/04 o floatDias pode passar a ser 3...
Então eu precisaria de uma função que pudesse somar uma quantidade de dias dentro da query para poder me dar o resultado desejado. Felizmente dá pra fazer isso com o PostgreSQL usando a seguinte sintaxe:
Somar dias e horas a uma data (Fonte: http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Internas/Data_e_Hora):
Só que para usar isso eu não poderia usar HQL, teria que usar sql nativo. Para continuar usando HQL, tive que criar minhas funções HQL "add_day(data, dias)" e "sub_day(data, dias)" e extender o dialeto org.hibernate.dialect.PostgreSQLDialect:
Agora, finalmente, eu posso fazer a consulta HQL que eu gostaria (não testado a fundo ainda) :
Espero que isso possa ajudar alguém no futuro!
|
|
|
 |
|
|
|
|