如何使用Joda Time查询HQL(Hibernate)中的日期?

fab*_*474 8 orm grails hibernate hql jodatime

我确信熟悉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)
}
Run Code Online (Sandbox Code Playgroud)

在我的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)
Run Code Online (Sandbox Code Playgroud)

但我得到了异常...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方法转换为特定格式(哪一个?),还是有另一种方法可以做到这一点?

谢谢,

法比安.

Chs*_*y76 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();
Run Code Online (Sandbox Code Playgroud)

我相信你可以在Grails中做类似的事情.如果没有,请将日期格式化为yyyyMMddhhmmss(无空格)并将它们用单引号括起来 - 这样Hibernate会将它们视为常量,MySQL会隐式将它们转换为日期.


Pas*_*ent 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])
Run Code Online (Sandbox Code Playgroud)

检查executeQuery()文档以获取这两个选项的语法详细信息.