将 TYPE 用于 select 仅特定 class 和 Inheritance.table_per_class 策略

Using TYPE to select only specific class with Inheritance.table_per_class stategy

想象一下我们使用继承策略 TABLE_PER_CLASS 和 Template 作为 superclass 而 Product 作为 subclass.

的场景

模板:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "Templates")
@NamedQuery(name = "getAllTemplates", query = "SELECT t FROM Template t")
public class Template implements Serializable { ...}

产品:

@Entity
@Table(name = "Product")
public class Product extends Template  implements Serializable { ... }   

在这种情况下,我什至认为我的 DB 2 模板和 1 个产品。每当我调用模板 namedQuery 时,我都会检索类似的产品和模板。

我试过这样做:

SELECT t FROM Template t WHERE TYPE(t) = Template

然而它returns出现以下错误: class没有描述符,或者没有使用继承或者使用ClassExtractor进行继承的描述符

有没有办法只获取模板?

使用 TABLE_PER_CLASS 时,TYPE 运算符对子 类 不起作用。似乎没有关于将 TYPE 与 TABLE_PER_CLASS.

一起使用的明确信息

然而有很多帖子说这种策略效率低下,不完全推荐使用。

JPA 2.1 规范说 TABLE_PER_CLASS:

Support for the TABLE_PER_CLASS mapping strategy is optional in this release.

这也意味着支持可能只是部分的:像 TYPE 支持没有实现。

还有一些帖子表明不仅 Hibernate 受此困扰,请参阅(有些已经很老了,但仍然如此),例如:this and this.

所以作为结论:

  • 如果可能,更改为 SINGLE_TABLE 或 JOINED 策略
  • 接受它

在 Hibernate 中,您也可以尝试让它与 @DiscriminatorColumn 一起工作并将列添加到 Template 实体,但我个人认为这不值得付出努力。