سؤال

أواجه صعوبة في كتابة الاستعلام عن المجال التالي فصول:

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
]

جزء من هذا الاستعلام إلى مجموعة من العناوين الرئيسية للصحف كل الناس الذين المباراة أي من المجموعات.ثم من خلال تجميع من قبل الشخص والتحقق من عدد من النتائج يساوي عدد المجموعات في القائمة ، يمكنك أن تتأكد من أن هذا الشخص هو عضو في كل من الفئات المحددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top