2013-08-29 21 views
11

Czy istnieje sposób umieszczenia warunku zakresu dat, odnoszącego się do bieżącego czasu w kwerendzie JPA (który jest zgodny w różnych bazach danych)?Jak wysłać zapytanie "starsze niż trzy minuty" w WZP?

mogę zrobić

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

ale chcę to zrobić bez konieczności wiązania parametr (tak, że to może być skonfigurowany jako część o nazwie repozytorium zapytań i logika obliczenie daty nie trzeba wprowadzać kod wywołujący).

Tak więc zamiast :date potrzebuję "currentTime minus 3 minuty" jako literału twardego.

+0

Z tym pokrewnym pytaniem wynika, że ​​samo JPA nie wykonuje dat arytmetycznych, ale mogą to być konkretne implementacje. Byłbym w porządku z wersją Hibernate. http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

Odpowiedz

3

JPA obsługuje funkcje CURRENT_TIMESTAMP i CURRENT_TIME.

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

WZP specyfikacja nie posiada funkcji date, ale niektórzy dostawcy JPA takie jak EclipseLink zrobić.

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

JPA 2.1 definiuje również operatorowi funkcji do wywołania funkcji baz danych.

W EclipseLink chciałbym spróbować,

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

lub

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

Podwójne cytaty nie są poprawne i muszą zostać zastąpione pojedynczymi cudzysłowami. – tak3shi

1

Jeśli używasz Hibernate JPA wdrażania oraz Oracle dialektem, a następnie można użyć SYSDATE funkcję, która zwraca aktualna data i czas. Jeśli dodasz 1 do SYSDATE, doda to jeden dzień. obsługiwane

frakcje Dodawanie również:

  • sysdate + 1/24 doda godzinę
  • sysdate + 1/(24*60) doda minutę
  • sysdate + 1/(24*60*60) doda drugi

Więc zamiast: datę Potrzebuję "currentTime minus 3 minuty" jako literału twardego.

sysdate - 3/(24*60) będzie odjąć 3 minuty od aktualnej daty i czasu:

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

Records starszych niż 3 minuty będą zwracane i wiązanie parametr nie jest potrzebny.

+1

Czy to działa również tylko dla dialektu ORACLE lub MYSql? –