[英]Grails query association problem
我在編寫以下域類的查詢時遇到問題:
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)
類的group.id in (1,2)
查詢將不起作用,因為它可以是任何組,而不是兩者 。
這是我簡單的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類中,成員資格是Membership對象的列表。 您可以在不進行任何查詢的情況下查找對象是否在Collection(列表)中。 像這樣的東西應該做的工作。
if(Person.memberships.contains(Membership.findByPersonAndGroup(person1,group1)) && Person.memberships.contains(Membership.findByPersonAndGroup(person1,group2))){
...do something...
}
可能另一種解決方案更簡單,但我認為這只是另一種選擇。
干杯
有趣的問題。 不確定以前的解決方案是否在匹配組的數量上是通用的 - 在目前為止的情況下,我認為它固定為2。 雖然可能有一種方法可以使它們變量。
我在grails留言板上描述的另一種方式 - http://www.nabble.com/has-many-through-relationship-query---GORM--td23438096.html
包括作者的評論,Robert Fischer,“Grails Persistence with GORM and 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的部分將抓取所有匹配任何組的人員。 然后,通過按人分組並檢查結果數等於列表中的組數,您可以驗證此人是否是所有指定組的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.