سؤال

أنا أعمل على الكؤوس المشروع باستخدام السبات (جورم).لدي المجال التالي نماذج:

ClientContact {
   static hasMany = [owners: Person]
   static belongsTo = [Person]
}

Person {
   static hasMany = [clientContacts: ClientContact]
}

عند محاولة استرداد جميع ClientContacts مع محدد مالك (Person) أنا الوقوع في بعض مضحك القضايا.أنا باستخدام التالية معايير الاستعلام:

def query = {
   owners {
      eq("id", Long.parseLong(params.ownerId))
   }
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query) 

المشكلة هي عندما كنت من خلال تكرار كل من بلدي ClientContacts في النتائج, لديهم فقط واحد صاحب - عندما في الواقع ، أكثر من أصحابها.ما يعطي ؟ أنا أعرف السبات/GORM يستخدم كسول جلب, ولكن اعتقد انه من جلب جميع أصحاب على ClientContact عندما حاولت الوصول إليها.

أي أفكار ؟ أود الاستمرار في استخدام قائمة() وظيفة لأنه يوفر بعض لطيفة ترحيل الميزات.

هل كانت مفيدة؟

المحلول

أعلم أن هذا الموضوع قديم جدا, ولكن أنا فقط واجهت نفس المشكلة اليوم و الحل يبدو أن استخدام الأسماء المستعارة ، لذا بدلا من ذلك:

def query = {
        owners {
                eq("id", Long.parseLong(params.ownerId))
        }
}

يمكن للمرء أن محاولة:

def query = {
        createAlias("owners", "o")
        eq("o.id", Long.parseLong(params.ownerId))
}

الاستعلام الأول يخلق اليسار الخارجي ينضم والثاني يخلق الداخلية ينضم.يرجى الاطلاع على هذا الرابط للحصول على وصف أكثر تفصيلا: http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html

نصائح أخرى

اثنين من الملاحظات السريعة:

  1. فإن [الكؤوس الوثائق](http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(جورم).html#5.2.1.3 كثير إلى كثير) يقول أن كثير إلى كثير جمعية يجب أن يكون يدويا مشفرة ، الافتراضي السقالات لن تفعل ذلك.
  2. قد تحتاج إلى استخدام eqId() المعيار - انظر createCriteria

معرف النسخة الخاصة خصائص كل GORM الطبقات.أنت لا تحتاج إلى تحديد في فئة الإعلان, و لا يمكنك استخدام المعيار معهم.

تحتاج بالتأكيد إلى استخدام eqID المعيار

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top