Java Grails查询关联问题

Java Grails查询关联问题,java,grails,hql,criteria,gorm,Java,Grails,Hql,Criteria,Gorm,我在为以下域类编写查询时遇到问题: class Person { static hasMany = [memberships: Membership] } class Membership { static belongsTo = [person: Person, group: Group] Date joinDate = new Date(); Group group; Person person; } class Group { stat

我在为以下域类编写查询时遇到问题:

class Person {
  static hasMany = [memberships: Membership]
}

class Membership {

    static belongsTo = [person: Person, group: Group]

    Date joinDate = new Date();
    Group group;
    Person person;
}

class Group {
     static hasMany = [memberships: Membership]
}
基本上,我希望找到属于组列表的所有人员(假设组ID为
(1,2)
。这里的技巧是该人员必须是两个组的成员。我更喜欢条件查询,但HQL也可以


请注意,在(1,2)中使用类似于
group.id的查询将不起作用,因为它可以是任何一个组,而不是两个组

这是我的简单HQL方法:

Person.executeQuery("FROM Person x WHERE x IN (SELECT m.person from Membership m WHERE m.group = :group1) AND x IN (SELECT m.person from Membership m WHERE m.group = :group2)", [ group1: Group.get(1), group2: Group.get(2) ])

干杯

也许您不需要查询。在Person类中,memberships是成员身份对象的列表。您可以在不进行任何查询的情况下查找对象是否位于集合(列表)中。 像这样的东西应该能完成任务

if(Person.memberships.contains(Membership.findByPersonAndGroup(person1,group1)) && Person.memberships.contains(Membership.findByPersonAndGroup(person1,group2))){
  ...do something...
}
也许另一种解决方案更简单,但我认为这只是另一种选择

干杯


有趣的问题。我不确定以前的解决方案在匹配组的数量上是否通用-在目前的情况下,我认为它固定为2。尽管可能有一种方法使它们可变

我在grails留言板上描述的另一种方式-

包括作者Robert Fischer对“Grails持久性与GORM和GSQL”的评论


@chadsmall

这里有另一种方法,可以避免以编程方式将子查询附加到WHERE子句:

查询:

SELECT count(person.id) AS numPeople, person 
FROM Person as person 
INNER JOIN 
person.memberships AS mships
WITH mships.group.id IN (:groupIds) 
GROUP BY person.id 
HAVING COUNT(person.id) = (:numOfGroupIds)
以及一些示例值:

[
  groupIds: [8,9,439,86843]
  numOfGroupIds: 4
]

此查询中直到GROUP BY的部分将获取与任何组匹配的所有人员。然后,通过按人员分组并检查结果数是否等于列表中的组数,您可以验证此人是否是所有指定组的成员。

在您的示例中,person对象是一个类;我无法查询类本身,我需要一个person实例来检查其成员身份集合。顺便说一下,在条件中这是不可行的,因为如果我多次查询成员身份关联,我最终会得到一个hibernate“双重关联”问题。我对你的映射有疑问,它是对的还是错的?我认为它是对的,是很久以前的事了…好的,我试图用你的数据创建域,但它显示了一些错误,不管怎样,它很好,希望你的问题得到解决