【问题标题】:Limit the set of selected fields to those of the target subclass将选定字段的集合限制为目标子类的集合
【发布时间】:2022-01-18 09:24:25
【问题描述】:

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

@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

它将生成一个 SQL,该 SQL 仅选择来自 Parent 实体和 Child1 实体的列。如果我使用 where type='child1'Parent 实体中选择

from Parent p where type(p)='child1'

它将仅返回 Child1 实体,但 SQL 查询从 ParentChild1Child2 中选择所有列。是否有可能从 Parent 实体查询使用鉴别器列(即仅限于 Child1 实体)并获取特定的 SQL 查询,即仅选择来自 ParentChild1 的列。

【问题讨论】:

  • 也许您可以显示您的 HQL 查询?
  • 更新了问题
  • 为什么不能直接使用from Child1

标签: java hibernate inheritance discriminator


【解决方案1】:

投影似乎有效:

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 用户指南excerpt:

有一个特定的表达式类型只在 select 子句中有效。 Hibernate 将此称为“动态实例化”。 JPQL 支持其中的一些功能,并将其称为“构造函数表达式”。

因此,我们不是在此处处理 Object[](再次参见 Hibernate Query API),而是将值包装在类型安全的 Java 对象中,该对象将作为查询结果返回。

...

投影类在实体查询中必须是全限定的,并且必须定义一个匹配的构造函数。

这里的类不需要映射。它可以是一个 DTO 类。

如果它确实代表一个实体,则结果实例以 NEW 状态返回(非托管!)。

但是,我只想SELECT c FROM Child1 c。实际上,我很惊讶 Hibernate 没有抱怨实体 Parent 缺少属性 child1Property

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2010-12-30
    • 2013-08-14
    相关资源
    最近更新 更多