الاستفسارات حريصة التحميل مع GORM / السبات
سؤال
وبلدي الكؤوس المقدسة التطبيق لديه كائنات المجال التالي
class ProductType {
String name
static hasMany = [attributes: Attribute]
}
class Attribute {
String name
static belongsTo = [productType: ProductType]
}
وبلدي DB لديه 7 ProductType
s ولكل من هذين يحتوي 3 Attribute
s. إذا كنت تنفيذ الاستعلام:
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 ProductType
s كما هو متوقع. ما أنا في عداد المفقودين؟
المحلول
ويجب عليك قراءة هذا أسئلة وأجوبة: السبات لا يقوم بإرجاع نتائج مميزة للاستعلام مع الخارجي انضمام جلب تمكين مجموعة (حتى إذا كنت تستخدم الكلمة متميزة)؟
وعند تحديد تحميل حريصة، يحتوي resultset و، كما لاحظت، 7 * 3 صفوف ولكن في الواقع لديك سوى 7 productTypes الكائنات في الذاكرة (و 2 مراجع إضافية لكل منها).
لتفعل ما تريد، يمكنك إضافة (أن تدرك أن الاستعلام SQL المصدر لم يتغير):
وSetResultTransformer(new DistinctRootEntityResultTransformer())
def results = ProductType.withCriteria {
fetchMode("attributes", org.hibernate.FetchMode.EAGER)
SetResultTransformer(new DistinctRootEntityResultTransformer())
}