HQL - Calculando intervalos entre datas  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
cassio
GUJ Master
[Avatar]

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
nbluis
GUJ Master
[Avatar]

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.
[WWW]
cassio
GUJ Master
[Avatar]

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
cassio
GUJ Master
[Avatar]

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
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
nbluis
GUJ Master
[Avatar]

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.
[WWW]
ricardosoares
JavaEvangelist
[Avatar]

Membro desde: 03/12/2004 09:49:13
Mensagens: 318
Localização: São Paulo, SP, Brasil
Offline

Criteria é a chave!

Ricardo Soares
cassio
GUJ Master
[Avatar]

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
cassio
GUJ Master
[Avatar]

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
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
nbluis
GUJ Master
[Avatar]

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.
[WWW]
cassio
GUJ Master
[Avatar]

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
ricardosoares
JavaEvangelist
[Avatar]

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
cassio
GUJ Master
[Avatar]

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
ricardosoares
JavaEvangelist
[Avatar]

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
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team