将 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
实体,但我个人认为这不值得付出努力。
想象一下我们使用继承策略 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
实体,但我个人认为这不值得付出努力。