Hibernate:使用HQL获取延迟集合

时间:2016-01-05 08:06:56

标签: java hibernate hql

我有两个大表(每个行数> 1亿行),让我们称之为父和子(父与父有一对多的关系)。当我使用连接提取时,查询非常慢 我还得到一个休眠警告“HH000104 firstresult maxresults指定集合提取在内存中应用”因为我使用了限制。

所以我试图在两个独立的查询中获取数据:
- 第一次查询获得所有父母的限制 - 第二个查询在第一个查询的父ID中使用parent.id获取子项

此解决方案执行得非常好,但是hibernate不会将子节点与父节点聚合,尽管这两个查询在同一会话中执行。

我想知道是否有办法使用HQL或一些java代码来实现这一点: - 我不希望使用条件API(我需要重写许多查询,并且我发现标准API查询难以维护) - 我不想将父/子关系更改为EAGER / BATCH,因为我无法在没有孩子的情况下查询父母

有什么想法吗?

1 个答案:

答案 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