2012-06-27 381 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) 
    } 
} 

你似乎有在你的例子不完整的投影也一样,如果你想只是女性成员的数量,或者你应该能够将它添加到上面的某些属性的总和。