Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:使用HQL获取惰性集合_Java_Hibernate_Hql - Fatal编程技术网

Java Hibernate:使用HQL获取惰性集合

Java Hibernate:使用HQL获取惰性集合,java,hibernate,hql,Java,Hibernate,Hql,我有两个大的表(每个都超过1亿行),让我们称它们为Parent和Child(Parent与Child有一对多的惰性关系)。当我使用连接获取时,查询速度非常慢 我还得到一个hibernate警告“HH000104 firstresult maxresults specified with collection fetch applying in memory”,因为我使用了一个限制 因此,我尝试在两个独立的查询中获取数据: -第一个查询获取具有限制的所有父级 -第二个查询获取第一个查询找到的父id

我有两个大的表(每个都超过1亿行),让我们称它们为Parent和Child(Parent与Child有一对多的惰性关系)。当我使用连接获取时,查询速度非常慢 我还得到一个hibernate警告“HH000104 firstresult maxresults specified with collection fetch applying in memory”,因为我使用了一个限制

因此,我尝试在两个独立的查询中获取数据:
-第一个查询获取具有限制的所有父级
-第二个查询获取第一个查询找到的父id中具有parent.id的子项

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

我想知道是否有一种方法可以使用HQL或一些java代码来实现这一点: -我不希望使用criteria API(我需要重写许多查询,我发现criteria API查询很难维护) -我不想将父/子关系更改为“渴望/批处理”,因为如果没有子关系,我将无法查询父/子关系


有什么想法吗?

第二个查询不应该只获取子项: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
第二个查询,不受限制:

select distinct p.id from Parent p where ... 
select p from Parent p left join fetch p.children where p.id in :idsSelectedByTheFirstQuery

谢谢你的快速回答。使用此解决方案,第二个查询的性能很差。因为孩子们有父id,我希望我可以在单独的查询中加载他们,并在会话中对他们进行分组……为什么它的性能很差?它的性能不应该比只选择子项的查询差得多,除非在子项和父项之间的联接列上没有索引。现在,如果只发布代码和DDL,我们就不必猜测所有内容。性能问题只会在表有数百万行时发生,因此还需要数据库来重现它。我希望有一个“简单”的解决方案来组装不需要类和代码的bean。。。我使用postgresql,在获取父项和子项时,无法从执行计划中找出查询的错误。当然,在父表和子表之间有一个索引。我猜查询会返回更多数据,因为每个父项都至少有两个子项,所以获取这两个子项意味着每个父项返回两次…@JDM没有理由它的执行速度比您建议的要慢很多。您最初的建议类似于来自Child where parent.id的
:idsSelectedByTheFirstQuery
。生成的SQL的不同之处在于简单地联接父表和子表,即使有一百万条记录,只要有适当的索引,父表和子表也应该是空的