jpa table_per_class الميراث: كيفية تحديد إدخالات الفئة الفائقة فقط؟

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

سؤال

أنا أستخدم 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top