在休眠中使用继承时如何仅获取一种实体?
Posted
技术标签:
【中文标题】在休眠中使用继承时如何仅获取一种实体?【英文标题】:How to fetch only one kind of entities while using inheritance in hibernate? 【发布时间】:2013-01-09 13:23:11 【问题描述】:我有这两个实现单表继承策略的类:
@Entity
@Table(name = "tableA")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("A")
class A
...
@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("B")
class B extends A
...
当我创建一个查询来获取所有 A 实体时,它也会给我带来 B 实体。如何只获取类型 A 的实体?
【问题讨论】:
你可以创建一个通用的抽象基类,并使 A 和 B 都扩展基类。 描述符列(“类型”)是否定义为超类中的@Basic?如果是,你可以选择它也许... 或者如果支持 JPA2.0,您也可以使用 SELECT a FROM A a WHERE TYPE(a) = A 我们仍然使用 JPA 1。我偶然发现了一些类似的建议:SELECT a FROM A a WHERE a.class = "A"
。事实证明,我最终使用了@guido 建议的解决方案。
@guido,请在您的第一条评论中发布答案,我会接受。
【参考方案1】:
您可以创建一个通用的抽象基类并让 A 和 B 都扩展基类,例如:
@Entity
@Table(name = "tableA")
@DiscriminatorColumn(name="`type`")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
abstract class Base
...
@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("A")
class A extends Base
...
@Entity
@DiscriminatorColumn(name = "type")
@DiscriminatorValue("B")
class B extends Base
...
(请注意,SINGLE_TABLE 是默认策略,因此可以省略注释参数)。
或者如果支持 JPA2,您可以使用:
SELECT a FROM A a WHERE TYPE(a) = A
【讨论】:
以上是关于在休眠中使用继承时如何仅获取一种实体?的主要内容,如果未能解决你的问题,请参考以下文章