假设以下域对象:
UserChallenge {
String invitationKind
}
ChallengeGroup {
UserChallenge challenge
UserGroup group
}
UserGroup {
name
}
以下查询返回组关联的挑战,该关联部分填充了匹配的组:
UserChallenge.withCriteria {
eq('invitationKind', 'GROUP')
groups {
'in'('group.id', visibleGroupIds)
}
}
在帖子http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html中它建议使用createAlias()并修改上面的查询似乎有效:
UserChallenge.withCriteria {
eq('invitationKind', 'GROUP')
createAlias('groups', 'g')
'in'('g.group.id', visibleGroupIds)
}
但以下情况不起作用:
UserChallenge.withCriteria {
or {
eq('invitationKind', 'OPEN')
and {
eq('invitationKind', 'GROUP')
createAlias('groups', 'g')
'in'('g.group.id', visibleGroupIds)
}
}
}
并且仅返回匹配可见组ID的挑战,而不是“开放”的挑战。你把createAlias()调用放在哪里似乎并不重要。
以下工作正常:
UserChallenge.withCriteria {
or {
eq('invitationKind', 'OPEN')
and {
eq('invitationKind', 'GROUP')
groups {
'in'('group.id', visibleGroupIds)
}
}
}
}
除了它返回挑战时只有匹配的组(我试图解决的原始问题)。
答案 0 :(得分:2)
虽然问题很严重,但任何遇到同样问题的人都会发现它很有用。使用分离标准查询是实现它的另一个想法。根据问题中提供的信息,我试图使用分离标准查询来完成它。请在此处找到有关detached criteria
的更多信息def userGroup = new DetachedCriteria(UserGroup).build {
eq("group.id", visibleGroupIds)
}
def getOb = UserChallenge.createCriteria()
def listReturned = getOb.list {
or{
eq('invitationKind', 'OPEN')
and {
eq('invitationKind', 'GROUP')
"groups" {
userGroup
}
}
}
}``