Как я могу запросить "более трех минут" в JPA?

Есть ли способ установить условие диапазона дат, ссылающееся на текущее время в запросе JPA (совместимом между базами данных)?

Я могу сделать

SELECT m FROM Mail m WHERE m.sentAt < :date

но я хочу сделать это, не связывая параметр (так что это можно настроить как часть именованного репозитория запросов, а логике вычисления даты не нужно вводить код вызова).

Поэтому вместо :date мне нужно "currentTime минус 3 минуты" в качестве литерала жесткого кода.

Ответ 1

JPA поддерживает функции CURRENT_TIMESTAMP и CURRENT_TIME.

https://en.wikibooks.org/wiki/Java_Persistence/JPQL#Functions

Спецификация JPA не имеет функций даты, но некоторые поставщики JPA, такие как EclipseLink, делают.

http://java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html

JPA 2.1 также определяет оператор FUNCTION для вызова функций базы данных.

В EclipseLink я бы попробовал,

SELECT m FROM Mail m WHERE m.sentAt < SQL("(sysdate - interval '3' minute)")

или,

SELECT m FROM Mail m WHERE m.sentAt < SQL("(? - interval '3' minute)", CURRENT_TIMESTAMP)

Ответ 2

Если вы используете Hibernate JPA-реализацию и диалект Oracle, вы можете использовать функцию SYSDATE, которая возвращает текущую дату и время. Если вы добавите 1 к SYSDATE, он добавит один день.

Также поддерживаются добавления фракций:

  • sysdate + 1/24 добавит час
  • sysdate + 1/(24*60) добавит минуту
  • sysdate + 1/(24*60*60) добавит второй

Итак, вместо: date Мне нужно "currentTime минус 3 минуты" как литерал жесткого кода.

sysdate - 3/(24*60) вычитает 3 минуты с текущей даты и времени:

SELECT m FROM Mail m WHERE m.sentAt < sysdate - 3/(24*60)

Записи старше 3 минут будут возвращены и привязка параметров не потребуется.