JPA TABLE_PER_CLASS继承:如何只选择SELECT超类条目?

时间:2010-11-23 13:17:57

标签: inheritance jpa table-per-class

我正在使用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();
}

因此查询即“SELECT p FROM Parent p”。

我怎样才能真正接收父条目,而不是这个inheritacne层次结构的所有条目?

简而言之:如何保持所有子条目不变,只返回父条目?

编辑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".

我已经更新到EclipseLink的最新稳定版本2.1.1,但它没有解决问题。

2 个答案:

答案 0 :(得分:8)

如果您的EclipseLink版本支持JPA 2.0,则可以编写

SELECT p FROM Parent p WHERE TYPE(p) = Parent

答案 1 :(得分:4)

Type表达式与TABLE_PER_CLASS继承结合在EclipseLink 2.1.1下不起作用,这似乎是一个错误。

另见JPA 2.0: TYPE expression exception

的答案