2

我使用 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

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

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

有没有办法告诉 Hibernate 避免不必要的内部连接?也许是一些特定于 Hibernate 的查询提示?

4

1 回答 1

0

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

因此,如果要为 a 加载对象,subclass必须从父类加载信息(因为子类本身并不代表没有父类中的属性的完整图片)。这会导致JOIN查询子对象时出现错误。

JPA 文档中,您可以看到这是 JOINED 策略的主要缺点。

1 ) 除了下面描述的 table-per-class 策略的某些用途之外,joined 策略通常是继承模型中最慢的。检索任何子类需要一个或多个数据库连接,存储子类需要多个 INSERT 或 UPDATE 语句。

于 2014-08-14T20:36:17.640 回答