【问题标题】:Grails - find where date ranges overlapGrails - 查找日期范围重叠的位置
【发布时间】:2013-05-02 22:48:30
【问题描述】:

我有一个带有 startDate 和 endDate 属性的 Grails 域对象。

查找范围 [startDate, endDate] 与指定日期范围重叠的所有对象的最佳方法是什么?我知道如何在 SQL 中做到这一点,但想知道是否有任何 Grails/GORM 魔法可以更简洁地做到这一点。

另外,endDate 是一个可选属性。

SQL / JPQL 查询类似于

from MyObject obj where obj.startDate <= ?1 and (obj.endDate is null OR obj.endDate >= ?2)

【问题讨论】:

标签: grails grails-orm


【解决方案1】:

在这种情况下采用 Grails/GORM 的两种方式:

懒惰:-

def today = new Date()
def query = MyObject.where {
    startDate <= (today - 10) && (endDate == null || endDate >= today + 10)
}
def listOfMyObjects = query.list()

渴望:-

def today = new Date()
def listOfMyObjects = MyObject.findAll {//or find{} if you need the first occurance
    startDate <= (today - 10) && (endDate == null || endDate >= today + 10)
}

【讨论】:

  • 渴望正是我所寻找的。 Grails / GORM 是否足够聪明,可以将其转换为 SQL WHERE,还是只是将整个列表拉出并在内存中执行?
  • 是的,Grails/GORM 正在为您做这件事,将其转换为下面的 HQL,这正是您之前所说的 Magic。您已经知道诀窍,只是不想使用它,但 Grails 让您觉得它更加冗长。 :)
  • 如果可以的话,我会再次投票。使用闭包以惯用方式定义条件绝对很棒,就好像它是内存中的对象,但最终被转换为 SQL。