java - 使 Hibernate 鉴别器值使用绑定(bind)变量而不是文字

标签 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”,但它们可能不同且顺序不同)。但是,如果使用绑定(bind)变量代替那些鉴别器值文字,它将是相同的 sql id 并具有相同的执行计划。

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

或者,有没有一种方法我仍然可以在不使用鉴别​​器值的情况下使用我的扩展类?如果我尝试这样做并在每个扩展类上添加 @Entity 注释,即使没有鉴别器注释,它也会提示缺少鉴别器类型。

最佳答案

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

我想到的最接近的解决方法是从基类中选择并按子类显式过滤:

entityManager.createQuery("select gne from NamePartEntity gne where type(gne) = :subclass")
    .setParameter("subclass", GivenNameEntity.class)
    .getResultList();

关于java - 使 Hibernate 鉴别器值使用绑定(bind)变量而不是文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187186/

相关文章:

sql - 检查另一个表中是否不存在某项

sql - Oracle - 沿间隔对值进行分组

oracle - 在oracle中查询日期时间

c# - 使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView

java - 为什么查询dsl实体路径限制在四级?

java - 我的应用程序由于调用 (activateNotificationsMessages) 函数而崩溃

java - 模块化工作定义

php - 如何使用自定义条件从 PHP 中的多维数组中删除重复值

sql - sequelize.js $like 运算符中的 % 符号是什么意思?

java - 片段之间的导航出现问题