我确信熟悉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:00
或Fri Nov 27 22:01:20 CET 2009
)
我还尝试将date1转换为Date类而没有成功
那么正确的HQL代码是什么?我应该使用patternForStyle方法转换为特定的格式(哪一个?),还是有另一种方式来实现它?
谢谢,
小煜。
答案 0 :(得分:7)
我不是Grails专家,但在java中,您通常会生成date1
和date2
个查询参数并将其绑定为:
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会隐式将它们转换为日期。
答案 1 :(得分:5)
我在ChssPly中指出,您应该将date1
和date2
声明为查询参数(位置或命名),然后绑定它们。在这里,我们将使用命名参数。使用Grails传递命名查询参数的常用方法是通过Map
:
def queryStr = "from Book b where b.releaseDate > :date1 and b.releaseDate < :date2"
Book.executeQuery(queryStr, [date1: date1, date2: date2])
查看executeQuery()
文档,了解这两个选项的语法详细信息。
答案 2 :(得分:3)
您还可以使用ISO8601日期格式比较日期,例如:
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作为后端进行了测试。请记住将日期包装为字符串。