如何避免对使用JOINED策略映射的实体继承的简单查询进行不必要的内连接?

时间:2014-08-14 18:51:52

标签: sql hibernate inheritance jpa joined-subclass

我正在使用JPA 2和Hibernate 4.2.0-Final作为提供者,我有以下实体:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Person {

    @Id
    private String id;

    .. Person attributes ..
    .. Getters/Setters ..
}

@Entity
@Table(uniqueConstraints={@UniqueConstraint(name="UniqueCode", columnNames="code")})
public class Customer extends Person {

    @Column(nullable=false)
    private String code;

    .. Other Customer attributes ..
    .. Getters/Setters ..
}

我有以下JPQL:

SELECT count(distinct c.code) FROM Customer c

Hibernate为其生成以下SQL:

select
    count(distinct customer0_.code) as col_0_0_ 
from
    Customer customer0_ 
inner join
    Person customer0_1_ 
        on customer0_.id=customer0_1_.id

但我只需计算具有不同代码的客户,这恰好是特定于Customer的字段,因此内部联接不需要“人”。我希望Hibernate生成如下的SQL(即没有连接表'Person'):

select
    count(distinct customer0_.code) as col_0_0_ 
from
    Customer customer0_

有没有办法告诉Hibernate避免不必要的内连接?也许是一些特定于Hibernate的Query Hint?

1 个答案:

答案 0 :(得分:0)

JOINED Strategy中的JPA对对象层次结构中的每个类使用单独的表。

因此,如果您要为subclass加载对象,您还拥有来从父类加载信息(因为仅子类不代表完整图片而没有父级中的属性类)。查询子对象时会产生JOIN

JPA documentation您可以看出这是The JOINED策略的主要劣势。

  

1)除了描述的每类表策略的某些用法之外   在下面,联合策略通常是继承中最慢的   楷模。检索任何子类需要一个或多个数据库连接,   并且存储子类需要多个INSERT或UPDATE语句。