假设我有这些实体类(省略了JPA批注):
class TableA { Long id; List<TableB> tableBs; }
class TableB { Long id; List<TableC> tableCs; }
class TableC { Long id; List<TableD> tableDs; }
class TableD { Long id; int foo; }
这给了我们这个实体“图” /“依赖项”:
TableA ---OneToMany--> TableB ---OneToMany--> TableC ---OneToMany--> TableD
如果我想深入加载一个TableA对象的所有子实体,子子实体和子子实体,JPA将产生以下查询:
我想避免这种1 + n *(m + 1)查询来延迟加载TableA对象的所有子子实体。
如果我必须手动进行查询,则只需要 4 个查询:
我想打电话给
我认为JPA无法解决这个问题。
答案 0 :(得分:1)
如果我必须手动进行查询,我只需要4个查询
那么,为什么不将一个查询连接到四个表呢?
但是,如果要限制查询的数量,我会首先尝试Hibernate的@Fetch(FetchMode.JOIN)
(不确定其他JPA提供程序是否有类似的注释)。这是一个提示,告诉Hibernate使用联接来加载子实体(而不是发出单独的查询)。它并不总是适用于嵌套的一对多关联,但是我会尝试在层次结构的最深层定义它,然后逐步进行,直到找到可接受的性能(或禁止的结果集大小)为止。 。
如果您正在寻找通用解决方案,那么令人遗憾的是,我不知道任何将遵循您描述的算法的JPA提供程序,既不是一般功能也不是选择加入的功能。这是一个非常特定的用例,我想由于库未包含针对特殊情况的优化而变得健壮的代价。
注意:如果您想在一个用例中急于加载一个实体层次结构,但在一般情况下却使这些实体延迟加载,则需要查找JPA实体图。您可能还需要使用FETCH JOIN
编写自定义查询,但我认为通常不支持嵌套FETCH JOINS
。