JPA EntityGraph:Hibernate尝试在单个查询中获取多个集合,从而导致大型笛卡尔积

时间:2015-03-27 13:44:57

标签: java hibernate postgresql jpa

我在JPA后面使用Hibernate。我正在使用EntityGraph来获取所需的数据。

我有A,B和C类

class A {
  Integer attrib1;
  String attrib2;
  List<B> blist; // typical size: about 250 objects
  List<C> clist; // typical size about 100 objects
}

类B和C有自己的子图,我将与主图一起提取。

主图表出现问题。

总共生成3个SQL查询来获取所有需要的数据。 问题出在第一个查询中。

为了减少查询的数量(这就是我的想法),在第一个查询中,Hibernate在A,B和C上进行连接。

一个 在A.x = B.x上左外连接B. 在A.y = C.y

上留下外连接C.

这会创建高度次优的结果集,其中包含数万行,并且跨行有大量重复数据。

我可以看到,如果A和B之间的关系数量相同,则通过避免对每个集合进行单独查询,相同的查询可以变得非常有效。 A和C很小。然而,在这种情况下,由于关系的数量很大,它会失败。

如何让hibernate不这样做?

我希望Hibernate为每个Collection生成一个单独的SQL查询。这样,成本将随着收集大小而线性增加。

0 个答案:

没有答案