2009-05-05 50 views
3
我无法编写查询以下域类

Grails的查询关联问题

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)之类的查询将不起作用,因为它可以是任何的组,不是

+0

我对你的映射有疑问,是对还是错? – 2013-11-24 11:58:27

+0

我认为这是正确的,很长一段时间以前... – 2013-12-04 10:45:30

+0

好吧,我试图创建与您的数据域,但它显示了一些错误,反正其罚款,希望你的问题得到解决 – 2013-12-04 10:50:50

回答

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

干杯

0

也许你并不需要的查询。在Person类中,成员资格是Membership对象的列表。你可以找到一个对象是否在一个集合(列表)中,而不作任何查询。 像这样的东西应该能够完成这项工作。

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

也许另一种解决方案是简单的,但我认为这只是另一种选择。

干杯

Groovy Collections

0

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

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

包括作者,罗伯特·菲舍尔的“Grails的余辉格姆和GSQL”的评论。

@chadsmall

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抓取所有的这些e匹配任何的人。然后,按人进行分组并检查结果数量是否等于列表中的组数,您可以验证此人是否是所有指定组的成员。