الكؤوس الاستعلام جمعية المشكلة
سؤال
أواجه صعوبة في كتابة الاستعلام عن المجال التالي فصول:
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]
}
في الأساس أريد أن وجدت جميع الأشخاص الذي ينتمي إلى قائمة المجموعات (دعنا نقول مجموعة معرفات (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) ])
هتافات
نصائح أخرى
ربما أنت لا تحتاج إلى الاستعلام.في فئة الشخص عضوية قائمة العضوية الكائنات.يمكنك أن تجد إذا هو كائن في مجموعة (قائمة) دون إجراء أي استفسار.شيئا من هذا القبيل ينبغي القيام بهذه المهمة.
if(Person.memberships.contains(Membership.findByPersonAndGroup(person1,group1)) && Person.memberships.contains(Membership.findByPersonAndGroup(person1,group2))){
...do something...
}
ربما الحل الآخر هو simplier ، ولكن أعتقد أن هذا هو مجرد خيار آخر.
هتافات
مشكلة مثيرة للاهتمام.غير متأكد السابق حلول عامة على عدد من يقابل المجموعات - في الحالات حتى الآن, انها ثابتة في 2 على ما أعتقد.على الرغم من أن ربما هناك طريقة لجعلها متغير.
طريقة أخرى لوصف هنا على الكؤوس messageboard - http://www.nabble.com/has-many-through-relationship-query---GORM--td23438096.html
بما في ذلك التعليق من الكاتب روبرت فيشر من "الكؤوس مع استمرار GORM و 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
]
جزء من هذا الاستعلام إلى مجموعة من العناوين الرئيسية للصحف كل الناس الذين المباراة أي من المجموعات.ثم من خلال تجميع من قبل الشخص والتحقق من عدد من النتائج يساوي عدد المجموعات في القائمة ، يمكنك أن تتأكد من أن هذا الشخص هو عضو في كل من الفئات المحددة.