在 Grails / GORM findAll 闭包中使用静态方法

Using static method in Grails / GORM findAll closure

我正在将 Grails 应用程序从 2.2.4 升级到 2.5.0,从 Hibernate 3 升级到 Hibernate 4。

有一个现有的 GORM findAll 查询将域对象的 java.util.Date 属性(名为 start)传递给静态方法的调用 returns Date 的副本,删除了时间部分。

这是 findAll 调用的简化版本(不包括抛出异常的标准):

Reservation.findAll {
    DateUtils.justDate(start) == DateUtils.justDateToday()
}

这在 2.2.4 中运行没有任何异常,但在 2.5.0 中,它抛出一个 GroovyCastExceptionstart 是一个 grails.gorm.DetachedCriteria,并且不能转换为java.util.Date.

我怎样才能让查询起作用?

我可以使用类似的东西:

Reservation.findAll {
    start >= DateUtils.justDateToday() &&
    start <  DateUtils.justDateTomorrow()
}

但这似乎不够优雅。此外,域对象属性可能用作其他 findAll 闭包中静态方法的参数,因此针对此问题的通用解决方案仍然有用。

使用 where 查询,您可以使用 date()month()year() 等方法,如下所示:

import static java.util.Calendar.*
Date today = new Date()

Reservation.where {
    year(start) == today[YEAR] &&
        month(start) == today[MONTH] &&
            day(start) == today[DAY_OF_MONTH]
}.list()