将所选字段集限制为目标子类的字段集



我使用的是单表继承,一个父实体:

@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查询从ParentChild1Child2中选择所有列。是否有可能从Parent实体使用鉴别器列(即仅限于Child1实体(进行查询,并获得特定的SQL查询,即仅从ParentChild1中选择列。

投影似乎有效:

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

相关内容

最新更新