我使用的是单表继承,一个父实体:
@Entity
@Table(name = "parent")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public class Parent {
// ...
}
和两个子实体:
@Entity
@DiscriminatorValue("child1")
public class Child1 extends Parent {
@Column(name = "child1_property")
private Integer child1Property;
// ...
}
@Entity
@DiscriminatorValue("child2")
public class Child2 extends Parent {
@Column(name = "child2_property")
private Integer child2Property;
// ...
}
现在,如果我直接从Child1
实体查询(HQL(:
from Child1
它将生成仅从CCD_ 2实体加上CCD_。如果我使用where type='child1'
从Parent
实体中进行选择
from Parent p where type(p)='child1'
它将只返回Child1
实体,但SQL查询从Parent
、Child1
和Child2
中选择所有列。是否有可能从Parent
实体使用鉴别器列(即仅限于Child1
实体(进行查询,并获得特定的SQL查询,即仅从Parent
和Child1
中选择列。
投影似乎有效:
SELECT new fully.qualified.name.of.Child1(p.id, p.name, p.child1Property)
FROM Parent p
WHERE TYPE(p) = 'child1'
产生
select
parent0_.id as col_0_0_,
parent0_.name as col_1_0_,
parent0_.child1_property as col_2_0_
from
parent parent0_
where
parent0_.type='child1'
Hibernate用户指南摘录:
有一个特定的表达式类型仅在select子句中有效。Hibernate称之为">动态实例化";。JPQL支持其中的一些特性,并将其称为">构造函数表达式";。
因此,我们不是在这里处理Object[](再次参见Hibernate Query API(,而是将值包装在类型安全的Java对象中,该对象将作为查询结果返回。
投影类必须在实体查询中完全限定,并且必须定义匹配的构造函数
这里的类不需要映射。它可以是DTO类。
如果它确实代表一个实体,则返回的实例处于NEW状态(未管理!(。
然而,我只是SELECT c FROM Child1 c
。事实上,我很惊讶Hibernate没有抱怨实体Parent
缺少属性child1Property
。