質問

次のドメインクラスのクエリを作成できません。

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)などのクエリは、両方ではなく任意のグループにできるため、機能しません。

p>
役に立ちましたか?

解決

これが私の単純な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クラスでは、membershipsはMembershipオブジェクトのリストです。クエリを実行せずに、オブジェクトがコレクション(リスト)にあるかどうかを確認できます。 このような何かが仕事をする必要があります。

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

「Grails Persistence with GORM and GSQL」の著者であるRobert Fischerのコメントを含む。

@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までの部分は、グループの any に一致するすべてのユーザーを取得します。次に、人でグループ化し、結果の数がリスト内のグループの数と等しいことを確認することで、この人が指定されたすべてのグループのメンバーであることを確認できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top