2013-08-29 2 views
11

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

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

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

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

Так что вместо :date Мне нужно «currentTime минус 3 минуты» как литерал жесткого кода.

+0

Этот связанный с этим вопрос, кажется, предполагает, что сама JPA не выполняет арифметику даты, но конкретные реализации могут. Я был бы в порядке с версией Hibernate. http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

ответ

3

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) 
+0

Двойные кавычки неверны и должны быть заменены одинарными кавычками. – tak3shi

1

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

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

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

Таким образом, вместо: дата Мне нужно «currentTime минус 3 минуты» как литерал жесткого кода.

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

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

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

+1

Будет ли это работать только для диалекта ORACLE или MYSql? –