jpql إنشاء كائن جديد في بيان محدد - تجنب أو احتضان؟

StackOverflow https://stackoverflow.com/questions/2355728

سؤال

لقد تعلمت مؤخرًا أنه من الممكن إنشاء كائنات جديدة في 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top