jpa table_per_class الميراث: كيفية تحديد إدخالات الفئة الفائقة فقط؟
-
27-09-2019 - |
سؤال
أنا أستخدم Eclipselink كمزود JPA. علاوة على ذلك ، أستخدم بنية الميراث table_per_class التالية
@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@NamedQueries({
@NamedQuery(name=Parent.QUERY_FIND_ALL, query="SELECT p FROM Parent p")
})
public class Parent {
// the class code follows here
}
@javax.persistence.Entity
@NamedQueries({
@NamedQuery(name=Child.QUERY_FIND_ALL, query="SELECT c FROM Child c")
})
public class Child extends Parent {
// the class code follows here
}
المشكلة الآن هي أنني أريد فقط تلقي إدخالات فئة الوالدين. ولكن مع الاستعلام المسماة "SELECT P from Parent P" يتم أيضًا إرجاع جميع الإدخالات من طاولة الطفل.
الرمز المحدد أو البحث هو كما يلي:
public List findWithNamedQuery(String query) {
return em.createNamedQuery(query).getResultList();
}
وبالتالي الاستعلام هو IE "SELECT P من Parent P".
كيف يمكنني فقط تلقي الإدخالات الوالدية فقط وليس كل إدخالات التسلسل الهرمي المورث؟
باختصار: كيف يمكنني ترك جميع إدخالات الأطفال دون مساس ، وإعادة إدخالات الوالدين فقط؟
تحرير 1:
أنا أستخدم Eclipselink 2.0.1 ، لكن في كل مرة أحاول فيها حل Axtavt عبر تعبير النوع ، أحصل على الخطأ التالي:
"Invalid Type Expression on [my.domain.Parent]. The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance".
لقد قمت بالتحديث أيضًا إلى أحدث إصدار مستقر 2.1.1 من Eclipselink ، لكنه لا يحل المشكلة.
المحلول 2
لا يعمل التعبير النوع مع table_per_class الميراث تحت Eclipselink 2.1.1 ، يبدو أن هذا خطأ.
انظر أيضا الجواب على JPA 2.0: نوع استثناء التعبير
نصائح أخرى
إذا كان إصدارك من Eclipselink يدعم JPA 2.0 ، فيمكنك الكتابة
SELECT p FROM Parent p WHERE TYPE(p) = Parent