Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Java framework quarkus JPA, como somar dias à uma data na consulta jpql

Preciso muito de ajuda em uma duvida. Tenho um código que somava, em uma consulta jpql, uma data adicionando + 2 dias desta forma

... CASE WHEN acc.datePayment > acc.dateDue + 2 THEN 1 ELSE 0 END ...

Ele soma + 2 dias à data e compara dentro de um case na consulta, na entidade da mapeada esses campos são do tipo LocalDate, isso sempre funcionou, porém atualizei o quarkus para a versão 3.10.0 e estava na 3.6.1, agora ele não reconhece esse calculo mais, não encontrei nada até agora que fizesse a soma, uso banco de dados Postgresql e tentei ultilizar o + interval '2 days', ou + intervar '2' day, e ele não aceita, tentei usar a função make_interval, sem sucesso. Sei que da pra fazer com query nativa, mas gostaria de uma solução ultilizando jpql pois queria usar o contrutor new no select como esta.

Se alguém souber uma solução que possa ajudar

2 respostas
solução!

Olá, Vinícius! Tudo bem?

A partir da versão 3.10.0 do Quarkus, pode ter havido mudanças na forma como as expressões JPQL são interpretadas ou na integração com o Hibernate. Uma forma de adicionar dias a uma data em JPQL, que é independente de atualizações específicas de framework, é utilizando a função FUNCTION. Essa função permite chamar funções nativas do banco de dados numa consulta JPQL.

No seu caso, como você está usando PostgreSQL, você pode tentar utilizar a função nativa date_add do PostgreSQL dentro de uma expressão JPQL. Veja como você poderia reformular sua consulta:

... CASE WHEN acc.datePayment > FUNCTION('date_add', acc.dateDue, 2) THEN 1 ELSE 0 END ...

A função date_add deve ser substituída pela função equivalente no PostgreSQL que é date_trunc. A consulta ficaria assim:

... CASE WHEN acc.datePayment > FUNCTION('date_trunc', 'day', FUNCTION('timestamp', acc.dateDue) + INTERVAL '2 days') THEN 1 ELSE 0 END ...

Essa abordagem utiliza a função FUNCTION para integrar funções específicas do PostgreSQL dentro do contexto JPQL, mantendo a portabilidade e a capacidade de usar construtores no select, como você mencionou.

Por favor, teste essa solução no seu ambiente para verificar se resolve o problema com a nova versão do Quarkus.

Espero que essa sugestão funcione para você e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Não funcionou dessa forma, ele não aceita o Interval '2 days', tentei colocar varias formas mas com o Inteval ali não da certo, porém ele aceita o extract(Epoch from Current_timestamp), convertendo em segundos consigo somar e comparar, foi o unico jeito de resolver para o postgresql. Vlw pelo caminho, não sabia que podia usar o Function novamente dentro de outro Function