2

我是grails的新手,我对hibernate并不熟悉。我遇到了一个关于在 grails 中使用executeQuery进行休眠查询的问题。我刚刚使这段代码类似于有问题的原始代码:

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])

每当nonMemberList为空时就会发生错误,并且我发现当我使用is not语法时列表不应该为空。

我对休眠查询不是很熟悉,这就是为什么我有一个问题,我应该使用什么其他休眠查询,它的行为也像原始代码一样。感谢您分享您的知识。

4

4 回答 4

2

您是否尝试过使用标准?位于此处: http: //grails.org/doc/latest/guide/GORM.html#criteria

请先为 nonMemberList 尝试下面的代码,看看它是否产生了 null:

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

希望能帮助到你。

于 2012-06-27T06:50:06.307 回答
1

好吧,在我看来,你所追求的是女性成员,如果你不需要单独的非成员列表,那么你可以使用类似的东西来获取女性列表;

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

您的示例中似乎也有一个不完整的预测,如果您只想要女性成员的数量或某些财产的总和,您应该能够将其添加到上面。

于 2012-06-28T00:44:04.053 回答
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
于 2012-06-27T06:59:39.417 回答
0
def nonMemberList = Group.withCriteria {
    eq('status', 'CONFIRMED_MEMBER')
}.collect { it.name }
于 2012-06-27T13:41:59.617 回答