| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 10:11:36
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
Olá pessoal, Estou tendo dificuldades para criar uma consulta com HQL, onde é necessário calcular a soma de uma data com um intervalo em meses. A questão é que a quantidade de meses é variável. Sei que no Hibernate cálculos de intervalos de datas não são padronizados (pelo menos foi o que eu li no JIRA do Hibernate), é algo dependente do banco. Pois bem, estou usando postgresql. Tenho uma classe assim: E a classe TipoInstrumento é mais ou menos assim Preciso verificar se a ultimaCalibracao, somada ao intervalo em meses da periodicidade é menor que a data atual. Tentei algo como Óbviamente não funcionou. Alguma idéia? Obrigado!
This message was edited 1 time. Last update was at 16/01/2008 10:40:44
|
Cássio Marques
Blog
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 10:22:33
|
nbluis
GUJ Master
![[Avatar]](/images/avatar/f0682320ccbbb1f1fb1e795de5e5639a.jpg)
Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline
|
Não entendi bem esse hql....
Exemplifique melhor para eu tentar te ajudar....
|
Luis Eduardo Bohrer
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 10:35:42
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
nbluis wrote:Não entendi bem esse hql.... Exemplifique melhor para eu tentar te ajudar....
Esqueça esse HQL que eu coloquei, qualquer query que resolva meu problema serve  Tenho um atributo 'Date ultimaCalibracao' na classe Instrumento. Essa classe Instrumento possui um atributo da classe TipoInstrumento, a qual por sua vez possui um inteiro 'periodicidade'. Preciso retornar todas as instâncias da classe Instrumento cuja soma da ultimaCalibracao com a periodicidade de seu TipoInstrumento seja menor que a data atual Em pseudo-código seria algo como
This message was edited 1 time. Last update was at 16/01/2008 10:40:25
|
Cássio Marques
Blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 10:44:59
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
Em SQL (para o PostgreSQL) isso aqui funciona: Agora, passar isso pra HQL que tá difícil de acertar... Como cálculo de intervalo entre datas é dependente do banco, tentei algo como Mas recebi o seguinte erro
This message was edited 1 time. Last update was at 16/01/2008 10:45:56
|
Cássio Marques
Blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 10:47:53
|
ebarros
JavaGuru
Membro desde: 16/01/2008 10:08:54
Mensagens: 230
Offline
|
jah tentou o usar o datediff ex: datediff('data1','data2')/365 ira retornar o intervalo entre as datas.
|
Everton Barros
Fil 4:13 ?Tudo posso naquele que me fortalece?
Javafree |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 10:49:00
|
nbluis
GUJ Master
![[Avatar]](/images/avatar/f0682320ccbbb1f1fb1e795de5e5639a.jpg)
Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline
|
ebarros wrote:jah tentou o usar o datediff ex: datediff('data1','data2')/365 ira retornar o intervalo entre as datas.
Mas isso não é hql.... é dependente de banco....
|
Luis Eduardo Bohrer
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:13:35
|
ricardosoares
JavaEvangelist
![[Avatar]](/images/avatar/1cc8a8ea51cd0adddf5dab504a285915.jpg)
Membro desde: 03/12/2004 09:49:13
Mensagens: 318
Localização: São Paulo, SP, Brasil
Offline
|
Criteria é a chave!
|
Ricardo Soares |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:17:56
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
ricardosoares wrote:Criteria é a chave!
Olá,
Não entendi essa parte
Porque esse (-1) ?
Outro problema é que eu acho que isso não iria funcionar, pois eu não tenho como saber de antemão esse intervalo de meses que está no atributo periodicidade. Cada instância da classe Instrumento persistida possui uma periodicidade diferente!
Obrigado!
|
Cássio Marques
Blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:22:16
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
Ok, entendi o porque do (-1)...
Mas ainda assim não vai funcionar, como eu disse, eu não sei de antemão a quantidade de meses.
|
Cássio Marques
Blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:23:54
|
ebarros
JavaGuru
Membro desde: 16/01/2008 10:08:54
Mensagens: 230
Offline
|
entao cara vc vai ter q fazer algo do tipo criando sessao para acessar funçoes especificas do banco de dados entao ficaria algo assi:
ISession _session = NHibernateSessionManager.Current;
IQuery query = m_session.CreateQuery("SELECT a FROM tb1 as a WHERE datediff(Day, :date, a.BDate) > 0");
query.SetDateTime("date", _someDate);
ow no lugar do datediff vc coloca a funçao q vc fez para realizar o calculo q vc conseguiu direto no postgresql.
|
Everton Barros
Fil 4:13 ?Tudo posso naquele que me fortalece?
Javafree |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:26:48
|
nbluis
GUJ Master
![[Avatar]](/images/avatar/f0682320ccbbb1f1fb1e795de5e5639a.jpg)
Membro desde: 27/05/2006 01:31:51
Mensagens: 1531
Localização: Porto Alegre - RS
Offline
|
ebarros wrote:entao cara vc vai ter q fazer algo do tipo criando sessao para acessar funçoes especificas do banco de dados entao ficaria algo assi:
ISession _session = NHibernateSessionManager.Current;
IQuery query = m_session.CreateQuery("SELECT a FROM tb1 as a WHERE datediff(Day, :date, a.BDate) > 0");
query.SetDateTime("date", _someDate);
ow no lugar do datediff vc coloca a funçao q vc fez para realizar o calculo q vc conseguiu direto no postgresql.
Dai não vai ser hql.. e vai ser dependente de banco...
Com essas condições fica fácil...
|
Luis Eduardo Bohrer
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:28:06
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
nbluis wrote:
ebarros wrote:entao cara vc vai ter q fazer algo do tipo criando sessao para acessar funçoes especificas do banco de dados entao ficaria algo assi:
ISession _session = NHibernateSessionManager.Current;
IQuery query = m_session.CreateQuery("SELECT a FROM tb1 as a WHERE datediff(Day, :date, a.BDate) > 0");
query.SetDateTime("date", _someDate);
ow no lugar do datediff vc coloca a funçao q vc fez para realizar o calculo q vc conseguiu direto no postgresql.
Dai não vai ser hql.. e vai ser dependente de banco...
Com essas condições fica fácil...
É exatamente o que estou tentando evitar, criar query nativa...
|
Cássio Marques
Blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:39:14
|
ricardosoares
JavaEvangelist
![[Avatar]](/images/avatar/1cc8a8ea51cd0adddf5dab504a285915.jpg)
Membro desde: 03/12/2004 09:49:13
Mensagens: 318
Localização: São Paulo, SP, Brasil
Offline
|
cassio wrote:
Não entendi essa parte
Porque esse (-1) ?
Outro problema é que eu acho que isso não iria funcionar, pois eu não tenho como saber de antemão esse intervalo de meses que está no atributo periodicidade. Cada instância da classe Instrumento persistida possui uma periodicidade diferente!
Obrigado!
Esse (-1) é que, ao invés de somar um numero de meses da "ultimacalibracao", subtrai-se esses meses da data corrente.
Só agora observei: a periodicidade varia com o instrumento, né? Neste caso... ainda não sei como implementar no Criteria.
Mas vale a pena dar uma pesquisada. O Criteria é bastante interessante.
|
Ricardo Soares |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:45:19
|
cassio
GUJ Master
![[Avatar]](/images/avatar/8ae7398026ed8f2172aefd6cbc856bc8.jpg)
Membro desde: 19/06/2006 08:25:28
Mensagens: 1336
Localização: Caieiras-SP
Offline
|
Pessoal, resolvi usando Criteria mas tive que enfiar uma restrição nativa ali, não teve jeito... Não é bem o que eu queria mas resolveu meu problema. Se eu descobrir uma maneira de fazer sem utilizar essa restrição nativa eu posto aqui. Muito obrigado a todos!
This message was edited 1 time. Last update was at 16/01/2008 11:46:55
|
Cássio Marques
Blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/01/2008 11:57:03
|
ricardosoares
JavaEvangelist
![[Avatar]](/images/avatar/1cc8a8ea51cd0adddf5dab504a285915.jpg)
Membro desde: 03/12/2004 09:49:13
Mensagens: 318
Localização: São Paulo, SP, Brasil
Offline
|
acho que isso pode funcionar:
considerando que "ultimaCalibracao" seja do tipo TIMESTAMP, 2592000000 (2.592E9) representa um mês em milisegundos, resultado de 1000 * 60 * 60 * 24 * 30
por via das dúvidas, force ser do tipo date:
daí, o resultado para comparação vem em número de dias
This message was edited 1 time. Last update was at 16/01/2008 12:18:48
|
Ricardo Soares |
|
|
 |
|
|