Hibernate忽略单个继承的FetchType

Hibernate忽略单个继承的FetchType,hibernate,jpa,fetching-strategy,Hibernate,Jpa,Fetching Strategy,我有3个从另一个实体继承的实体。 我正在使用策略单_表 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 例如,B类、C类和D类继承自A类 在实体B上,我急切地加载另一个实体X。不幸的是,Hibernate忽略了我的注释,并为每个实体B创建一个select来获取实体X @ManyToOne(fetch=FetchType.EAGER) private Projekt projekt; 我的select语句如下所示: ''从a'中选择a

我有3个从另一个实体继承的实体。 我正在使用策略单_表

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
例如,B类、C类和D类继承自A类

在实体B上,我急切地加载另一个实体X。不幸的是,Hibernate忽略了我的注释,并为每个实体B创建一个select来获取实体X

@ManyToOne(fetch=FetchType.EAGER)
private Projekt projekt;
我的select语句如下所示: ''从a'中选择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查询从继承的所有类,它确实是这样做的。不幸的是,它还对每个结果行执行select语句来查询“projekt”,我不想这样做。

您希望它做什么?如果您是“从A”-那么它将获取所有继承类型的实体。不可能(或者至少不容易)创建一个sql查询来获取B、C、D,然后为B急切地获取X。您希望它做什么

为了避免许多查询,可以在关联上设置BatchSize。这将优化批量加载Xs,而不是对每个B进行一次查询


如果您只对B实体感兴趣,您可以将查询写为“从B”,在这种情况下,关联将被急切地获取。

Hibernate不会将连接插入到从HQL/JPQL查询生成的SQL查询中,以获取
FetchType.EAGER

为了插入
join
您需要显式地指定
left join fetch
,我想这不会给
InheritanceType造成问题。尽管在其他子类中不存在这种关系,但SINGLE_TABLE

from A a left join fetch a.projekt

您的select语句不是有效的JPQL。你确定不是“从a中选择a”吗?如果Hibernate为每个B生成一个select来获取X,那么它不会忽略您的注释:X是急切地获取的。谢谢,我更改了示例。我试着让它尽可能简单。我更新了问题。我想获取所有条目。这是正确的。但是我不想为类型B的每一行都使用另一个select语句来查询成员projekt。我试图使用所有这些注释,但它们将被忽略。