当前位置: 首页 > 知识库问答 >
问题:

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

邹铭
2023-03-14

在类上使用@DiscriminatorColumn并在子类上使用@DiscriminatorValue时,Hibernate生成的SQL将discriminator值用作涉及discriminator列的子句的文字。

@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
}
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以这样一种方式使用鉴别器列/值注释,即使用绑定变量而不是文字?我知道可以用这种方式重写实体来避免这种情况,但我想看看是否可以用现有的注释以某种方式获得绑定变量功能。

共有1个答案

张砚
2023-03-14

不,不可能把它从盒子里拿出来。

我想到的最接近的变通方法是从基类中进行选择,并显式地按子类进行筛选:

entityManager.createQuery("select gne from NamePartEntity gne where type(gne) = :subclass")
    .setParameter("subclass", GivenNameEntity.class)
    .getResultList();
 类似资料:
  • 我有一个具体的JPA实体超类,它使用鉴别器列与映射,还有两个子类实体,它们用其他属性扩展了这个超类。 在某些情况下,我希望指定额外的鉴别器值,而不必为每个类型显式定义子类(也就是说,并不是每个“baseEntity”都指定支持子类/单独表的额外属性)。这种策略在数据库设计和Java类层次结构中都很有效,但是,Hibernate JPA不允许这样做,并抛出,因为没有映射到鉴别器的子类: 在本例中,我

  • 我的SINGLE_TAB继承Hibernate配置中出现了一个奇怪的情况,@DiscriminatorColumn似乎被忽略了,而查询总是默认返回到'dtype'列。这就像我在完全没有包含注释(默认列名为'dType')时看到的行为一样。 基本实体: 子类实体: 我还需要访问每个对象中的鉴别器值本身(postType字段)。我仍然有相同的行为,即使我移除它,所以它似乎不是原因。 当我试图通过JPA

  • 我有一个这样的场景 它的子类具有鉴别器值“creator” 现在,我不想再为帐户类型“user”添加一个类(类似于),因为“creator”和“user”都与帐户类型相关。 我需要一个可能的解决方案,在这里设置我的鉴别器值要么‘创建者’或‘用户’的基础上,帐户的类型。 有没有办法根据条件在类内部设置我的鉴别器值? 我如何继续执行? 请帮帮我。

  • 我有一个奇怪的行为,JPA类层次结构使用一个表。基本上,我有两个实体EntityMap和EntityMapB,它们都扩展了EntityMaps。鉴别器值为“ENTITY_TYPE”,对于EntityMap为A,对于EntityApb为B。不知何故,我得到了EntityMapA类型的对象,其中鉴别器值设置为“B”! 我正在使用Hibernate 3.3作为JPA提供程序。 这是代码: 最后,我在En

  • Nginx 作为一个成熟、久经考验的负载均衡软件,与其提供丰富、完整的内置变量是分不开的,它极大增加了对 Nginx 网络行为的控制细度。这些变量大部分都是在请求进入时解析的,并把他们缓存到请求 cycle 中,方便下一次获取使用。首先来看看 Nginx 对都开放了那些 API。 参看下表: 名称 说明 $arg_name 请求中的name参数 $args 请求中的参数 $binary_remot