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

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メッセージボードで説明するもう1つの方法-http ://www.nabble.com/has-many-through-relationship-query---GORM--td23438096.html

「GORMとGSQLを使用したGrailsPersistence」の著者であるRobertFischerからの解説を含みます。

@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 に答える