簡體   English   中英

Grails查詢關聯問題

[英]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...
}

可能另一種解決方案更簡單,但我認為這只是另一種選擇。

干杯

Groovy集合

有趣的問題。 不確定以前的解決方案是否在匹配組的數量上是通用的 - 在目前為止的情況下,我認為它固定為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM