2009-02-04 7 views
24

Próbuję napisać tej kwerendy przy użyciu Hibernate 3 i Oracle 10.Jak używać bieżącej daty w zapytaniu HQL z bazą danych Oracle?

from Alert alert 
where alert.expiration > current_date() 
order by alert.priority, alert.updated, alert.name 

To tworzenie SQL tak -

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 

Dostaję tych wszystkich zwariowanych błędów jak „brakujące prawo nawias ", gdy pozornie jest idealnie zbalansowany nawias.

Dlaczego Oracle się w to wkurza? Czy istnieje lepszy sposób napisania mojego zapytania HQL?

Odpowiedz

36

Nie powinno to być current_date?

Hibernacja przetłumaczy go na właściwy dialekt.

Nie znalazłem prawdziwej "Hibernacji przetłumaczy to na powyższą" dokumentację referencyjną, ale wyrażenie, ogólnie, można znaleźć w HQL Expressions for Hibernate 4.3.

Następnie istnieje specyfikacja Java Persistence API 2.0 (JPA), która definiuje wyrażenia dla języka zapytań Java Persistence (JPQL) i ich znaczenie np. dla current_date:

4.6.17.2.3 Funkcje Datetime functions_returning_datetime: = CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP Funkcje datetime zwracają wartość bieżącej daty, godziny i znacznika czasu na serwerze bazy danych .

4

Czy current_date() jest funkcją hibernacji?

Zamiast tego użyłbym sysdate. tak:

where alert.expiration > sysdate 

albo zignorować czas dnia:

where alert.expiration > trunc(sysdate) 
+1

Current_date i Current_timestamp są funkcjami Oracle. Current_date = Sysdate, ale Oracle nie potrzebuje() po wywołaniu funkcji. –

+7

CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP() są również funkcjami Hibernuj HQL. ("Java Persistence With Hibernate") –

+0

wystarczy podać CURRENT_DATE() w zapytaniu, na przykład: "i date = CURRENT_DATE()"; –

Powiązane problemy