2009-12-04 85 views
8

我相信有人熟悉HQL(我自己是新手)很容易回答這個問題。如何用Joda時間在HQL(休眠)中查詢日期?

在我的Grails應用程序中,我有以下的域類。

class Book { 
    org.joda.time.DateTime releaseDate //I use the PersistentDateTime for persisting via Hibernate (that use a DATETIME type for MySQL DB) 
} 

在我的HQL查詢,我想要檢索書籍的發行日期被包含在範圍date1 .. date2

比如我想:

DateTime date1, date2 
... 
def queryStr = "select * from Book as b where b.releaseDate > $date1 and b.releaseDate < $date2" 
def res = Book.executeQuery(queryStr) 

但我得到異常...caused by: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: 錯誤標誌指向日期格式(例如2009-11-27T21:57:18.010+01:00Fri Nov 27 22:01:20 CET 2009

我也嘗試將date1轉換成Date類沒有成功

那麼什麼是正確的HQL代碼?我應該使用patternForStyle方法轉換爲特定的格式(哪一個?),還是有另一種更清晰的方法來完成它?

謝謝,

Fabien。

+0

org.joda.time.DateTime如何映射到您的SQL?它是直接到現場嗎? java.util.Date和java.util.Calendar可以直接映射到數據庫字段。由於DateTime是一個聚合對象,因此它的價值在於,Grails插件可能在封面下使用了自定義映射類型(請參閱Java Persistence with Hibernate的第5.3節)。 – Alan 2009-12-04 22:08:03

+0

如代碼註釋中所述,DateTime使用來自joda-time-hibernate庫的PersistentDateTime自定義映射類型 – fabien7474 2009-12-04 22:34:00

回答

7

我不是Grails的專家,但在Java中你通常做date1date2查詢參數並結合它們的方式:

String hql = "select * from Book as b where b.releaseDate > :date1 and b.releaseDate < :date2"; 
session.createQuery(hql).setDate("date1", date1).setDate("date2", date2).list(); 

我敢肯定,你可以做的Grails類似的東西。如果沒有,請將日期格式設置爲yyyyMMddhhmmss(不包括空格)並將它們用單引號引起來 - 這樣Hibernate會將它們視爲常量,MySQL會將它們隱式轉換爲日期。

+0

非常感謝! 在您的回覆後,我進入了grails源代碼,發現它用於執行HQL查詢: Account.executeQuery(「從帳戶a中選擇不同的a.number,其中a。分支=:分支「,[分支:'倫敦']) 因此,我對我的方案做了同樣的工作,它的工作原理如下:Thx。 – fabien7474 2009-12-05 00:34:04

5

我指出ChssPly,你應該聲明date1date2作爲查詢參數(位置或命名),然後綁定它們。在這裏,我們將使用命名參數。通過使用Grails命名查詢參數的常用方法是通過Map

def queryStr = "from Book b where b.releaseDate > :date1 and b.releaseDate < :date2" 
Book.executeQuery(queryStr, [date1: date1, date2: date2]) 

檢查executeQuery()文檔的兩個選項的語法細節。

+0

嗨帕斯卡爾 Thx爲您提供幫助。 – fabien7474 2009-12-05 10:04:23

3

您也可以使用ISO8601日期格式e.g比較日期:

select * from Book as b 
where b.releaseDate > '2009-11-27T21:57:18.010+01:00' 
and b.releaseDate < '2010-11-27T21:57:18.010+01:00' 

我測試過這一點使用MySQL作爲後端。只要記住將日期包裝爲一個字符串即可。