我正在使用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?
答案 0 :(得分:0)
JOINED Strategy
中的JPA
对对象层次结构中的每个类使用单独的表。
因此,如果您要为subclass
加载对象,您还拥有来从父类加载信息(因为仅子类不代表完整图片而没有父级中的属性类)。查询子对象时会产生JOIN
。
从JPA documentation您可以看出这是The JOINED策略的主要劣势。
1)除了描述的每类表策略的某些用法之外 在下面,联合策略通常是继承中最慢的 楷模。检索任何子类需要一个或多个数据库连接, 并且存储子类需要多个INSERT或UPDATE语句。