我有3个实体从另一个实体继承。 我正在使用策略Single_Table
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
E.g。 B,C和D类继承自A
在实体B上我急切地加载另一个实体X.不幸的是,Hibernate忽略了我的注释并为每个实体B创建了一个选择来获取实体X.
@ManyToOne(fetch=FetchType.EAGER)
private Projekt projekt;
我的select语句如下所示: '从A'中选择一个
更多代码示例:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DType", discriminatorType = DiscriminatorType.STRING, length = 3)
public abstract class A {}
@Entity
@DiscriminatorValue(B.PREFIX)
public class B extends A {
@ManyToOne(fetch=FetchType.EAGER)
private Projekt projekt;
}
现在我希望Hibernate能够查询从A继承的所有类。不幸的是,它还为每个结果行执行一个select语句来查询“projekt”,我想避免这种情况。
答案 0 :(得分:1)
Hibernate不会将连接插入到FetchType.EAGER
的HQL / JPQL生成的SQL查询中。
为了插入join
,您需要明确指定left join fetch
,我猜它不会为InheritanceType.SINGLE_TABLE
创建问题,尽管其他子类中不存在此关系:
from A a left join fetch a.projekt
答案 1 :(得分:0)
你想要它做什么?如果你做“来自A” - 那么它将获取所有继承类型的实体。创建一个获取B,C,D然后为B提取X的sql查询是不可能的(或者至少不容易)。你想要它做什么?
要避免许多查询,您可以在关联上设置BatchSize。这将优化批量加载Xs - 而不是每个B的一个查询。
如果您只对B实体感兴趣,可以将查询编写为“来自B”,在这种情况下,将急切地提取关联。