AHu*_*ist 5 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
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个简单的条件查询,除了类之外没有任何条件,我会得到这样生成的SQL:
select this_.person_id as y0_ from name this_ where this_.part_type='GIV'
Run Code Online (Sandbox Code Playgroud)
在你有一些鉴别器值并且可以多次选择表之前,这并不是那么糟糕,例如下面的查询:
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
)
)
)
Run Code Online (Sandbox Code Playgroud)
可能有很多不同的SQL ID和基于文字的执行计划(在这种情况下'FAM','GIV','PFX',但它们可能是不同的,并且顺序不同).但是,如果使用绑定变量代替那些鉴别器值文字,那么它将是相同的sql id并具有相同的执行计划.
那么,是否有可能让Hibernate使用鉴别器列/值注释,以便使用绑定变量而不是文字?我知道有可能以这种方式重写我的实体以避免这种情况,但我想看看我是否可以通过某种方式获得现有注释的绑定变量功能.
或者,有没有一种方法我仍然可以使用我的扩展类而不使用鉴别器值?如果我尝试并在每个扩展类上都有@Entity注释,它会抱怨即使没有鉴别器注释也会错过鉴别器类型.
不,不可能将其从盒子中取出。
我想到的最接近的解决方法是从基类中进行选择并按子类显式过滤:
entityManager.createQuery("select gne from NamePartEntity gne where type(gne) = :subclass")
.setParameter("subclass", GivenNameEntity.class)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |