2013-05-02 56 views
3

我有一個Grails域對象,具有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) 
+0

在gorm中,您可以使用executequery運行您的hql查詢。看看這是否有幫助http://grails.org/doc/2.2.x/ref/Domain%20Classes/executeQuery.html – Alidad 2013-05-02 14:17:42

+0

沒有魔法我知道 – 2013-05-02 14:33:35

回答

7

兩種方式擁抱Grails的/格姆在這種情況下:

懶惰: -

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) 
} 
+2

渴望正是我所期待的。 Grails/GORM足夠聰明,可以將它翻譯成SQL WHERE,還是隻是將整個列表拉到內存中? – wrschneider 2013-05-02 16:19:48

+0

是的,Grails/GORM正在爲你做這件事,將它翻譯成一個HQL,下面就是你之前說的Magic的意思。你已經知道這個技巧,你只是不想使用它,但Grails使它更加冗長。 :) – dmahapatro 2013-05-02 17:03:06

+0

如果可以的話,我會再次加註。使用閉包來慣例地定義一個標準是非常棒的,就好像它是內存中的對象一樣,但最終被轉換爲SQL。 – wrschneider 2013-05-03 14:24:26