2013-08-29 14 views
11

Gibt es eine Möglichkeit, eine Datumsbereichsbedingung anzugeben, die auf die aktuelle Zeit in einer JPA-Abfrage verweist (die für Datenbanken kompatibel ist)?Wie kann ich in JPA "älter als drei Minuten" abfragen?

Ich kann

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

tun, aber ich will es tun, ohne einen Parameter zu binden (so dass dieser als Teil der benannten Abfrage-Repository konfiguriert werden kann und die Datumsberechnungslogik muss nicht betreten der aufrufende Code).

Also statt :date brauche ich "currentTime minus 3 Minuten" als Hard-Code-Literal.

+0

Diese Frage scheint darauf hinzudeuten, dass JPA selbst keine Datumsarithmetik ausführt, sondern spezifische Implementierungen. Ich wäre mit einer Hibernate-Version einverstanden. http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

Antwort

3

JPA unterstützt die Funktionen CURRENT_TIMESTAMP und CURRENT_TIME.

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

Die PPV-Spezifikation nicht über Datumsfunktionen, aber einige PPV-Anbieter wie Eclipse tun.

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

JPA 2.1 definiert auch die FUNCTION Operator Datenbank-Funktionen aufzurufen.

In Eclipse Ich würde versuchen,

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

oder

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

Die Anführungszeichen sind nicht korrekt und müssen durch einfache Anführungszeichen ersetzt werden. – tak3shi

1

Wenn Sie Hibernate JPA Implementierung und eine Oracle Dialekt verwenden, dann können Sie SYSDATE Funktion verwenden, die zurückgibt aktuelles Datum und Uhrzeit Wenn Sie 1 zu SYSDATE hinzufügen, wird ein Tag hinzugefügt.

Hinzufügen von Fraktionen wird ebenfalls unterstützt:

  • sysdate + 1/24 eine Stunde hinzufügen wird
  • sysdate + 1/(24*60) wird eine Minute
  • sysdate + 1/(24*60*60) hinzufügen wird eine zweite

Also statt hinzuzufügen: Datum Ich brauche "currentTime minus 3 Minuten" als Hard-Code-Literal.

sysdate - 3/(24*60) werden 3 Minuten vom aktuellen Datum und Uhrzeit subtrahiert:

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

Aufzeichnungen älter als 3 Minuten werden zurückgegeben und kein Parameter erforderlich ist verbindlich.

+1

Funktioniert es nur für ORACLE-Dialekt oder MYSQL? –