我正在对通用表“Sample”构建查询,并且我有几种从该表“SampleOne”、“SampleTwo”继承的类型。我需要这样的查询:
select s from Sample where s.type = :type
其中 type 将是表的鉴别器值。是否有可能以任何方式(并避免创建特定于实体的查询,每个 SampleOne、SampleTwo ... 等一个)
我将非常感谢对此主题的任何意见,
亲切的问候,P。
我正在对通用表“Sample”构建查询,并且我有几种从该表“SampleOne”、“SampleTwo”继承的类型。我需要这样的查询:
select s from Sample where s.type = :type
其中 type 将是表的鉴别器值。是否有可能以任何方式(并避免创建特定于实体的查询,每个 SampleOne、SampleTwo ... 等一个)
我将非常感谢对此主题的任何意见,
亲切的问候,P。
在 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
抽象实体
抽象类可以通过用 装饰类来声明为实体
@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
是鉴别器列,则只应返回指定子类型的元素,因此您唯一要做的就是将结果列表转换为您请求的子类型。
在 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
在您的存储库中执行此操作
@Query("SELECT p FROM BaseUserEntity p where p.class=:discriminatorValue")
public List<BaseUserEntity> findByDiscriminatorValue(@Param("discriminatorValue") String discriminatorValue);
BaseUserEntity
您的上级实体在哪里