2012-06-27 82 views
2

我是新來的grails,我對休眠並不熟悉。我在grails中遇到了一個關於使用executeQuery進行hibernate查詢的問題。我只是做了類似真實有問題的原代碼驗證碼:每當nonMemberList爲null,並且我發現,當我使用是這份名單不應爲空時休眠查詢 - grails

def nonMemberList = Group.executeQuery("select gp.name from Group gp where gp.status = 'CONFIRMED_MEMBER'") 
def FemaleMemberList = Group.executeQuery(""" select sum(case when g.isMale = false and g.name not in(:isNotConfirmedMember) from Group g where :startDate <= g.dateCreated and g.dateCreated < :endDate""", 
[isNotConfirmedMember: nonMemberList, startDate: startDate, endDate: endDate]) 

錯誤不是語法。

我對hibernate查詢並不熟悉,這就是爲什麼我有一個問題,我應該使用哪些其他hibernate查詢,它的行爲也像原始代碼一樣。 感謝您分享您的知識。

+0

nonMemberList不可能爲null,但它可能爲空。第二個查詢對於空列表無效,我相信你不能對空集合執行'in'操作 – tojofo

回答

2

您是否嘗試過使用Criteria?位於:http://grails.org/doc/latest/guide/GORM.html#criteria

請首先嚐試下面的代碼爲nonMemberList,看它是否產生空:

//non member list code 
def cNonMember = Group.createCriteria() 
def nonMemberList = cNonMember.list() { 
    eq("name", "CONFIRMED_MEMBER") 
} 

希望它能幫助。

0

我不知道Grails的語法,但我認爲你可以嘗試

select sum(case when g.isMale = false " + (nonMemberList == null ? "" : "and g.name not in(:isNotConfirmedMember)") + " from Group g where :startDate <= g.dateCreated and g.dateCreated < :endDate 
0
def nonMemberList = Group.withCriteria { 
    eq('status', 'CONFIRMED_MEMBER') 
}.collect { it.name } 
1

好,在我看來那是你所追求的是女隊員,如果你有沒有分別需要nonMember列表,然後你可以使用類似的東西來獲取女性列表;

def c = Group.createCriteria() 
def females = c.list { 
    le('startDate', startDate) 
    lt('dateCreated', endDate) 
    and { 
     ne('status', 'CONFIRMED_MEMBER') 
     eq('isMale', false) 
    } 
} 

你似乎有在你的例子不完整的投影也一樣,如果你想只是女性成員的數量,或者你應該能夠將它添加到上面的某些屬性的總和。