Ich möchte mit HQL abgelaufene Entitäten aus der Tabelle abrufen. So ähnlich:
%Vor%Ich kann nicht, wie man das mit HQL macht. Ich möchte nicht zusätzliche Abfragen machen, verarbeiten Datum in Java-Code und so weiter. Dies muss auf HQL-Ebene erfolgen.
Können Sie mir bitte helfen?
Abhängig von Ihrer Datenbank kann dies trivial einfach sein. HQL unterstützt integrierte herstellerspezifische Funktionen und Funktionen. Es unterstützt auch die Erweiterung des Dialekts durch die Registrierung neuer Funktionen, sofern diese nicht bereits von HQL unterstützt werden.
Nehmen wir an, Sie verwenden SQLServer (oder Sybase). SQLServer hat eine Funktion namens "DATEADD", die sehr leicht machen kann, was Sie wollen. Das Format ist:
%Vor%Sie können diese Funktion direkt in HQL verwenden, indem Sie zuerst die Funktion in Ihrem eigenen Hibernate Dialekt registrieren. Um dies zu tun, müssen Sie nur den Dialekt erweitern, den Sie gerade verwenden. Dies ist ein sehr einfacher Vorgang.
Erstellen Sie zuerst Ihre eigene Dialektklasse (ersetzen Sie 'SQLServer2008Dialect' durch Ihren eigenen DB-Anbieter):
%Vor%Ändern Sie als Nächstes Ihre Ruhezustandskonfiguration, um diese neue Klasse zu verwenden:
%Vor%Benutze einfach die Funktion:
%Vor%(Dies setzt voraus, dass Ihre Entität MyEntity heißt und das creation_date-Feld einer Eigenschaft namens creationDate zugeordnet ist.)
HQL unterstützt keine Arithmetik mit Datum und Uhrzeit, daher ist es nicht möglich, HQL zu erweitern. Der einfachste Weg ist wahrscheinlich SQL-Dialekt-Funktion für Datenbankanbieter für eine solche Berechnung zu registrieren. Eine andere Möglichkeit ist das Implementieren und Registrieren von Abfangjäger (Methode zum Überschreiben ist onPrepareStatement
), wenn Syntax mit Plus- und Minuszeichen bevorzugt wird.
Wenn die Lösung nicht rein in HQL sein muss und die Zeit vom JVM-Host reicht, ist es am einfachsten, das Datum, das 10 Minuten in der Vergangenheit liegt, zu berechnen und es als Argument anzugeben. Wenn die Datenbankzeit bevorzugt wird, kann dies erreicht werden, indem sie in einer separaten Abfrage abgefragt und dann um 10 Minuten davon dekrementiert wird.