Wie verwende ich das aktuelle Datum in einer HQL-Abfrage mit einer Oracle-Datenbank?
Frage
Ich versuche, diese Abfrage zu schreiben, mit Hibernate 3 und Oracle 10.
from Alert alert
where alert.expiration > current_date()
order by alert.priority, alert.updated, alert.name
Es ist die Schaffung SQL so -
Hibernate: select alert0_.ANNOUNCEMENTS_ID as ANNOUNCE1_1_, alert0_.ANNOUNCEMENT
S_NAME as ANNOUNCE2_1_, alert0_.ANNOUNCEMENTS_PRIORITY as ANNOUNCE3_1_, alert0_.
ANNOUNCEMENTS_EXPIRATION as ANNOUNCE4_1_, alert0_.ANNOUNCEMENTS_UPDATE_DATE as A
NNOUNCE5_1_ from NYC311_ANNOUNCEMENTS alert0_ where (alert0_.ANNOUNCEMENTS_EXPIR
ATION>current_date()) order by alert0_.ANNOUNCEMENTS_PRIORITY , alert0_.ANNOUNC
EMENTS_UPDATE_DATE , alert0_.ANNOUNCEMENTS_NAME
Ich bin all diese verrückten Fehler wie „fehlende rechte Klammer“ bekommen, wenn es scheinbar perfekt ausbalancierten Klammer ist.
Warum ist freaking Oracle auf diese aus? Gibt es einen besseren Weg, um meine HQL Abfrage zu schreiben?
Lösung
Sollte es nicht current_date
werden?
Hibernate wird es auf den richtigen Dialekt übersetzen.
Ich fand keine wirkliche Dokumentation Referenz „Hibernate dies, dass übersetzen wird“, aber der Ausdruck in der Regel in HQL Ausdrücke für Hibernate 4.3 .
Dann gibt es die Java Persistence API 2.0 (JPA) Spezifikation, die definiert, Ausdrücke für die Java Persistence Query language (JPQL) und deren Bedeutung zB für current_date
:
4.6.17.2.3 für Datum und Uhrzeit Funktionen functions_returning_datetime: = CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP Die Datetime-Funktionen geben den Wert des aktuellen Datums, der Uhrzeit und Zeitstempel auf der Datenbank Server.
Andere Tipps
Ist current_date()
eine Hibernate-Funktion?
würde ich sysdate
stattdessen verwenden. wie folgt aus:
where alert.expiration > sysdate
oder Tageszeit zu ignorieren:
where alert.expiration > trunc(sysdate)