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)
などのクエリは、両方ではなく任意のグループにできるため、機能しません。
解決
これが私の単純な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...
}
おそらく他の解決策は単純ですが、これは単なる別のオプションだと思います。
乾杯
興味深い問題。以前のソリューションが一致したグループの数に関して一般的かどうかはわかりません-これまでのところ、それは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 に一致するすべてのユーザーを取得します。次に、人でグループ化し、結果の数がリスト内のグループの数と等しいことを確認することで、この人が指定されたすべてのグループのメンバーであることを確認できます。