سؤال

وبلدي الكؤوس المقدسة التطبيق لديه كائنات المجال التالي

class ProductType {
    String name
    static hasMany = [attributes: Attribute]
}

class Attribute {       
    String name
    static belongsTo = [productType: ProductType]
} 

وبلدي DB لديه 7 ProductTypes ولكل من هذين يحتوي 3 Attributes. إذا كنت تنفيذ الاستعلام:

def results = ProductType.withCriteria {
    fetchMode("attributes", org.hibernate.FetchMode.EAGER)
}

وأتوقع 7 حالات ProductType إلى أن تعاد، ولكن في الواقع أحصل على 21 (7 × 3). وأنا أفهم أنه إذا كان لي أن تنفيذ استعلام SQL يعادل ما سبق، فإن مجموعة النتائج سيكون 21 الصفوف

prod1 | attr1
prod1 | attr2
prod1 | attr3
..... | .....
..... | .....
prod7 | attr1
prod7 | attr2
prod7 | attr3
-------------
Total 21

ولكن اعتقدت أنني عندما استرداد هذه النتائج عبر السبات / GORM يجب أن أحصل على شيء أشبه:

prod1 | attr1, attr2, attr3    
..... | ...................
..... | ...................
prod7 | attr1, attr2, attr3
---------------------------
Total 7

وبالمناسبة، إذا كنت إزالة حريصة التحميل من الاستعلام أعلاه، أحصل 7 ProductTypes كما هو متوقع. ما أنا في عداد المفقودين؟

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

المحلول

ويجب عليك قراءة هذا أسئلة وأجوبة: السبات لا يقوم بإرجاع نتائج مميزة للاستعلام مع الخارجي انضمام جلب تمكين مجموعة (حتى إذا كنت تستخدم الكلمة متميزة)؟

وعند تحديد تحميل حريصة، يحتوي resultset و، كما لاحظت، 7 * 3 صفوف ولكن في الواقع لديك سوى 7 productTypes الكائنات في الذاكرة (و 2 مراجع إضافية لكل منها).
لتفعل ما تريد، يمكنك إضافة (أن تدرك أن الاستعلام SQL المصدر لم يتغير):

وSetResultTransformer(new DistinctRootEntityResultTransformer())

def results = ProductType.withCriteria {
    fetchMode("attributes", org.hibernate.FetchMode.EAGER)
    SetResultTransformer(new DistinctRootEntityResultTransformer())
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top