Как я могу запросить "более трех минут" в 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 минут будут возвращены и привязка параметров не потребуется.