我有两个大表(每个行数> 1亿行),让我们称之为父和子(父与父有一对多的关系)。当我使用连接提取时,查询非常慢 我还得到一个休眠警告“HH000104 firstresult maxresults指定集合提取在内存中应用”因为我使用了限制。
所以我试图在两个独立的查询中获取数据:
- 第一次查询获得所有父母的限制
- 第二个查询在第一个查询的父ID中使用parent.id获取子项
此解决方案执行得非常好,但是hibernate不会将子节点与父节点聚合,尽管这两个查询在同一会话中执行。
我想知道是否有办法使用HQL或一些java代码来实现这一点: - 我不希望使用条件API(我需要重写许多查询,并且我发现标准API查询难以维护) - 我不想将父/子关系更改为EAGER / BATCH,因为我无法在没有孩子的情况下查询父母
有什么想法吗?
答案 0 :(得分:2)
第二个查询不应仅仅获取子项:Hibernate无法知道每个父项的所有子项都已被提取。
第二个查询应该让父母带着他们的孩子(但是使用in
子句只选择所需的父母,并且没有限制):
首次查询,已应用限制:
select distinct p.id from Parent p where ...
第二次查询,没有应用限制:
select p from Parent p left join fetch p.children where p.id in :idsSelectedByTheFirstQuery