Java 使用类型仅选择具有继承的特定类。表\u每\u类策略

Java 使用类型仅选择具有继承的特定类。表\u每\u类策略,java,hibernate,jpa,jakarta-ee,jboss,Java,Hibernate,Jpa,Jakarta Ee,Jboss,想象一下下面的场景,我们使用继承策略表每类和模板作为超类,而产品作为子类 模板: @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Table(name = "Templates") @NamedQuery(name = "getAllTemplates", query = "SELECT t FROM Template t") public class Template implements Serializab

想象一下下面的场景,我们使用继承策略表每类和模板作为超类,而产品作为子类

模板:

@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 { ... }   
在这个场景中,我甚至认为我的DB2模板和产品中有一个。无论何时调用模板namedQuery,我都会检索产品和模板

我试着这样做:

SELECT t FROM Template t WHERE TYPE(t) = Template
但是,它返回以下错误: 该类没有描述符,或者没有使用继承或使用类提取器进行继承的描述符


是否有办法只获取模板?

在使用“表每类”时,类型运算符也不适用于子类。似乎没有关于将TYPE与TABLE_PER_类一起使用的明确信息

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

JPA 2.1规范说明了每个类的表_:

在本版本中,对每个类的表映射策略的支持是可选的

这也意味着支持可能只是部分的:比如没有实现类型支持

还有一些帖子指出,Hibernate不仅会遭受这种情况,请参阅(有些很旧,但仍然如此),比如:and

因此,作为结论:

  • 如果可能,更改为单表或联接策略
  • 接受它

在Hibernate中,您也可以尝试使用
@DiscriminatorColumn
并将列添加到
模板
实体中,但我个人认为这不值得努力。

感谢您提供的信息:3很遗憾,这将允许进行大量操作。