【问题标题】:JPA TABLE_PER_CLASS inheritance: How to only SELECT superclass entries?JPA TABLE_PER_CLASS 继承:如何只选择超类条目?
【发布时间】:2011-05-14 11:20:12
【问题描述】:

我使用 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”。

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

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

编辑 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,但它并没有解决问题。

【问题讨论】:

  • 你有没有想过这个问题?我正在尝试做同样的事情。对于我的查询,我只希望返回父行,但也返回子行。
  • 关于这个问题的任何更新?我的意思是你有没有找到这个@gerry的答案

标签: inheritance jpa table-per-class


【解决方案1】:

如果你的 EclipseLink 版本支持 JPA 2.0,你可以写

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

【讨论】:

    【解决方案2】:

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

    另见JPA 2.0: TYPE expression exception的答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 2017-10-30
      • 2021-10-02
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多