12

我正在对通用表“Sample”构建查询,并且我有几种从该表“SampleOne”、“SampleTwo”继承的类型。我需要这样的查询:

select s from Sample where s.type = :type

其中 type 将是表的鉴别器值。是否有可能以任何方式(并避免创建特定于实体的查询,每个 SampleOne、SampleTwo ... 等一个)

我将非常感谢对此主题的任何意见,

亲切的问候,P。

4

4 回答 4

15

在 JPA 2.0 中,您可以使用TYPE表达式(尽管目前它不适用于 Hibernate 中的参数,请参阅HHH-5282):

select s from Sample s where TYPE(s) = :type

类似的特定于 Hibernate 的表达式是.class

select s from Sample s where s.class = :type
于 2011-02-03T09:30:11.543 回答
4

这是Java EE 6 教程的相关部分

抽象实体

抽象类可以通过用 装饰类来声明为实体@Entity。抽象实体类似于具体实体,但不能实例化。

可以像查询具体实体一样查询抽象实体。如果抽象实体是查询的目标,则查询对抽象实体的所有具体子类进行操作:

@Entity
public abstract class Employee {
    @Id
    protected Integer employeeId;
    ...
}
@Entity
public class FullTimeEmployee extends Employee {
    protected Integer salary;
    ...
}
@Entity
public class PartTimeEmployee extends Employee {
    protected Float hourlyWage;
}

如果我没看错,您的查询:

select s from Sample where s.type = :type

如果type是鉴别器列,则只应返回指定子类型的元素,因此您唯一要做的就是将结果列表转换为您请求的子类型。

于 2011-02-03T09:27:15.837 回答
2

在 Hibernate 4.3.7 中你仍然需要小心,因为在 的实现上仍然存在问题TYPE(),例如:

from SpoForeignPilot sfp where TYPE(sfp.partDocument) = :type

此查询不起作用,因为它错误地检查SpoForeignPilot了文档的类型而不是文档的类型。

您可以通过执行以下操作来解决此问题:

select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type
于 2016-08-01T11:09:16.563 回答
0

在您的存储库中执行此操作

@Query("SELECT p FROM BaseUserEntity p where p.class=:discriminatorValue")
    public List<BaseUserEntity> findByDiscriminatorValue(@Param("discriminatorValue") String discriminatorValue);

BaseUserEntity您的上级实体在哪里

于 2019-07-24T12:17:40.593 回答