使Hibernate鉴别器值使用绑定变量而不是文字

时间:2017-11-08 18:34:33

标签: java sql oracle hibernate jpa

在类上使用@DiscriminatorColumn和在子类上使用@DiscriminatorValue时,Hibernate生成的SQL使用鉴别器值作为涉及鉴别器列的子句的文字。

示例:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "PART_TYPE")
@Table(name = "NAME")
public class NamePartEntity implements Comparable<NamePartEntity> {
  // Stuff
}

@Entity
@DiscriminatorValue(value = "GIV")
public class GivenNameEntity extends NamePartEntity {
  // stuff
}

如果我创建一个简单的条件查询,除了类之外没有任何条件,我会得到这样的SQL生成:

select this_.person_id as y0_ from name this_ where this_.part_type='GIV'

在你有一些鉴别器值并且可以多次选择表之前,这并不是那么糟糕,例如下面的查询:

SELECT this_.person_id AS y0_
FROM name this_
WHERE this_.part_type='FAM'
AND this_.value_u    =:8
AND this_.tenant_id  =:9
AND this_.person_id IN
  (SELECT this_.person_id AS y0_
  FROM name this_
  WHERE this_.part_type='GIV'
  AND this_.value_u    =:10
  AND this_.tenant_id  =:11
  AND this_.person_id IN
    (SELECT this_.person_id AS y0_
    FROM name this_
    WHERE this_.part_type='GIV'
    AND this_.value_u    =:12
    AND this_.tenant_id  =:13
    AND this_.person_id IN
      (SELECT this_.person_id AS y0_
      FROM name this_
      WHERE this_.part_type='PFX'
      AND this_.value_u    =:14
      AND this_.tenant_id  =:15
      )
    )
  )

可能有大量不同的SQL ID和基于文字的执行计划(在这种情况下,'FAM','GIV','PFX',但它们可能不同并且顺序不同)。但是,如果使用绑定变量代替那些鉴别器值文字,它将是相同的sql id并具有相同的执行计划。

那么,是否有可能让Hibernate使用鉴别器列/值注释,以便使用绑定变量而不是文字?我知道有可能以这种方式重写我的实体以避免这种情况,但我想看看我是否能以某种方式获得现有注释的绑定变量功能。

或者,有没有一种方法我仍然可以使用我的扩展类而不使用鉴别​​器值?如果我尝试并在每个扩展类上都有@Entity注释,它就会抱怨即使没有鉴别器注释也会错过鉴别器类型。

1 个答案:

答案 0 :(得分:0)

  

或者,有没有办法我仍然可以使用我的扩展类   不使用鉴别​​器值?如果我尝试并拥有@Entity   每个扩展类的注释,它抱怨错过了   即使没有鉴别器注释,也可以使用鉴别器类型

这是因为您使用了InheritanceType.SINGLE_TABLE策略。您可以随时尝试使用其他策略,例如InheritanceType.JOINED,具体取决于您最常查询的内容。

另一方面,请问有多少类Names本身是一个指标,你必须将类型作为关系而不是子类型吗?