2009-02-04 62 views
24

我想寫使用Hibernate 3和Oracle這樣的查詢10如何在具有Oracle數據庫的HQL查詢中使用當前日期?

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

它創建這樣的SQL -

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 

我得到所有這些古怪的錯誤,如「失蹤的權利括號「,當有明顯完美平衡的括號時。

爲什麼Oracle在這方面嚇壞了?有沒有更好的方法來編寫我的HQL查詢?

回答

36

不是應該current_date

Hibernate會將它翻譯成適當的方言。

我沒有找到一個真正的「Hibernate會將其轉換爲」參考文檔,但表達式一般可在HQL Expressions for Hibernate 4.3中找到。

然後有Java Persistence API 2.0 (JPA)規範定義了Java持久性查詢語言(JPQL)的表達式及其含義,例如for current_date

4.6.17.2.3日期時間函數functions_returning_datetime:= CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP日期時間函數 返回數據庫 服務器上當前日期,時間和時間戳的值。

4

current_date()一個Hibernate函數嗎?我想用sysdate代替。像這樣:

where alert.expiration > sysdate 

,或者忽略一天中的時間:

where alert.expiration > trunc(sysdate) 
+1

Current_date和Current_timestamp是Oracle函數。 Current_date = Sysdate,但在函數調用後Oracle不需要()。 – 2009-02-05 21:32:36

相關問題