jpql إنشاء كائن جديد في بيان محدد - تجنب أو احتضان؟
سؤال
لقد تعلمت مؤخرًا أنه من الممكن إنشاء كائنات جديدة في JPQL
البيانات على النحو التالي:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
هل هذا شيء يجب تجنبه أو بالأحرى احتضانه؟ متى يتم استخدام هذه الميزة في ضوء الممارسات الجيدة؟
المحلول
لا تتجنب ذلك, ، الاختيار الجديد موجود لأن هناك حالات استخدام صحيحة تمامًا كما يتم تذكيرها في §10.2.7.2. تعبيرات مُنشئ JPQL في جملة SELECT التابع مواصفات EJB 3.0 JPA:
يمكن استخدام مُنشئ في قائمة SELECT لإرجاع مثيلات JAVA واحدة أو أكثر. لا يلزم أن تكون الفئة المحددة كيانًا أو يتم تعيينها إلى قاعدة البيانات. يجب أن يكون اسم المنشئ مؤهلاً بالكامل.
إذا تم تحديد اسم فئة الكيان في الفقرة الجديدة ، فإن مثيلات الكيان الناتجة في الحالة الجديدة.
SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100
باختصار ، استخدم الاختيار الجديد عندما لا ترغب في استرداد كيان كامل أو رسم بياني كامل للكائنات بطريقة آمنة من النوع (على عكس Object[]
). سواء أكنت تقوم بتخطيط نتيجة الاستعلام في فئة كيان أو فئة غير المعينة ستعتمد على SELECT. مثال نموذجي سيكون شاشة قائمة (حيث قد لا ترغب في جميع التفاصيل).
بمعنى آخر ، لا تستخدمه في كل مكان ولكن لا تمنع استخدامه (القليل من الأشياء أسود أو أبيض فقط).
نصائح أخرى
غالبًا ما تستخدم هذا النوع من الاستعلام عندما تريد استرداد أ كائن نقل البيانات. ربما يمكن أن يكون التقرير مكانًا جيدًا لاستخدامه. إذا كنت تريد فقط استرداد كائن مجال واحد (مثل من العائلة بدلاً من ذلك) ، لذلك لا يوجد سبب لاستخدامه.
لا يجب أن يكون الكائن الذي تم إنشاؤه باستخدام NEW بمثابة DTO ، أي كائن سيتم تصديره بواسطة طبقة العمل. يمكن أن يكون أيضًا كائن مجال POJO ، أي كائن يستخدم داخليًا بواسطة طبقة العمل.
سبب استخدام هذا النوع من pojos ككائن جزئي بدلاً من كيان JPA الكامل هو الأداء في أنواع محددة من الوصلات. مورد رائع يشرح هذا هو: http://use-the-index-luke.com/sql/join/hash-join-bartial-objects