I'm using EclipseLink as the JPA provider. Further I'm using the following TABLE_PER_CLASS inheritance structure
@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
}
The problem now is that I only want to receive entries of the parent class. But with the named query "SELECT p FROM Parent p" also all entries from the child table are returned.
The select or find code is as follows:
public List findWithNamedQuery(String query) {
return em.createNamedQuery(query).getResultList();
}
Thereby query is i.e. the "SELECT p FROM Parent p".
How can I only receive really the parent entries and not all entries of this inheritacne hierarchy?
In short: How can I leave all child entries untouched, and return only the parent entries?
EDIT 1:
I'm using EclipseLink 2.0.1, but every time I try axtavt's solution via the type expression, I get the following error:
"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".
I've updated also to the latest stable version 2.1.1 of EclipseLink, but it doesn't resolve the issue.
If your version of EclipseLink supports JPA 2.0, you can write
SELECT p FROM Parent p WHERE TYPE(p) = Parent
The Type expression in combination with TABLE_PER_CLASS inheritance doesn' t work under EclipseLink 2.1.1, this seems to be a bug.
See also the answer to JPA 2.0: TYPE expression exception
来源:https://stackoverflow.com/questions/4256393/jpa-table-per-class-inheritance-how-to-only-select-superclass-entries