JPA TABLE_PER_CLASS inheritance: How to only SELECT superclass entries?
Asked Answered
J

2

6

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.

Jellyfish answered 23/11, 2010 at 13:17 Comment(2)
Did you ever figure this out? I'm trying to do the same thing. For my query I only want the parent rows returned but the child rows are returned as well.Vardar
any update on this question ?I mean have you ever found the answer for this @JellyfishParamecium
J
5

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

Jellyfish answered 2/12, 2010 at 14:19 Comment(0)
S
8

If your version of EclipseLink supports JPA 2.0, you can write

SELECT p FROM Parent p WHERE TYPE(p) = Parent
Scission answered 23/11, 2010 at 13:26 Comment(0)
J
5

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

Jellyfish answered 2/12, 2010 at 14:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.