createAlias()解决方案返回所有关联的行在所有情况下都不起作用

时间:2011-04-14 22:23:36

标签: grails gorm

假设以下域对象:

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

除了它返回挑战时只有匹配的组(我试图解决的原始问题)。

1 个答案:

答案 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
                }
            }
        }
    }``