السبات المعايير كائن واحد المنال
سؤال
أنا أعمل على الكؤوس المشروع باستخدام السبات (جورم).لدي المجال التالي نماذج:
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
نصائح أخرى
اثنين من الملاحظات السريعة:
- فإن [الكؤوس الوثائق](http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(جورم).html#5.2.1.3 كثير إلى كثير) يقول أن كثير إلى كثير جمعية يجب أن يكون يدويا مشفرة ، الافتراضي السقالات لن تفعل ذلك.
- قد تحتاج إلى استخدام
eqId()
المعيار - انظر createCriteria
معرف النسخة الخاصة خصائص كل GORM الطبقات.أنت لا تحتاج إلى تحديد في فئة الإعلان, و لا يمكنك استخدام المعيار معهم.
تحتاج بالتأكيد إلى استخدام eqID المعيار
def query = {
owners {
eqId(Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)