3

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

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 也可以.

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

4

4 回答 4

1

这是我简单的 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) ])

干杯

于 2009-05-06T17:05:51.633 回答
0

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

if(Person.memberships.contains(Membership.findByPersonAndGroup(person1,group1)) && Person.memberships.contains(Membership.findByPersonAndGroup(person1,group2))){
  ...do something...
}

可能另一种解决方案更简单,但我认为这只是另一种选择。

干杯

Groovy 集合

于 2009-05-07T19:20:54.437 回答
0

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

我在 grails 留言板上描述的另一种方式 - http://www.nabble.com/has-many-through-relationship-query---GORM--td23438096.html

包括作者 Robert Fischer 对“Grails Persistence with GORM and GSQL”的评论。

@chadsmall

于 2009-05-12T18:05:34.797 回答
0

这是另一种避免必须以编程方式将子查询附加到 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 的部分会抓取与任何组匹配的所有人员。然后,通过按人分组并检查结果数是否等于列表中的组数,您可以验证此人是所有指定组的成员。

于 2012-02-01T08:37:10.470 回答