当前位置: 首页 > 知识库问答 >
问题:

Hibernate:用HQL提取惰性集合

葛昕
2023-03-14

我有两个大表(每个表>一亿行),让我们把它们称为Parent和Child(Parent与Child有一个懒散的一对多关系)。当我使用联接提取时,查询速度非常慢,而且我还得到一个Hibernate警告“HH000104 firstresult maxresults specified with collection fetch Application in Memory”,因为我使用了一个限制。

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

尽管两个查询在同一会话中执行,但hibernate并没有将子查询与父查询聚合在一起,该解决方案的性能非常好。

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

知道吗?

共有1个答案

鱼恩
2023-03-14

第二个查询不应该只获取子级: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
 类似资料:
  • 我的理解是,默认情况下,Hibernate将所有关系类型的FetchType设置为lazy。 在我的例子中,我有一个双向的OneToMany-ManyToOne关系,如下所示: 另一个问题是我如何得到一个有特定名字的孩子?是否可以通过存储库进行操作?还是需要getChildren(parentId)并迭代直到找到以特定方式命名的那个? 编辑:在一些建议之后,我继续这样实现了我的ChildRepos

  • 我试着调整我的应用程序,所以我把关系变成懒惰的,只取我需要的东西 我的多对一关系有一个问题,当我再次加载实体时转到lazy时,Hibernate将实体替换为代理,即使我获取了该实体,而该代理在应用程序的视图部分(JSF)中不工作。当多对一处于急切模式时,问题就会消失,但hibernate会为每个多对一执行一个select more(选择更多),即使我不需要它们 1/ 2/ JPQL查询: =>两次

  • 如果我有一个实体和一些惰性集合(、、,...),并且希望编写一个JpaRepository-method,该方法为我提供所有的人,这些人都渴望获取,这可能吗? 我知道人们可以在单个物体上做到这一点,但这在某种程度上可以在人的集合上做到吗?

  • 我有一个简单的查询很好地工作了一段时间,现在我将代码中的一些内容改为: (hibernate.cfg.xml) 和以下代码: 提交后,result对象不会加载列表(即从开始) 如果我执行在提交前,它会保持加载状态,而且,如果我使用它工作得很好。(但这不是它应该如何工作(让它在使用时打开并加载),createAlias应该一如既往地正常工作) 看起来DetachedCriteria的createAl

  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 问题内容: 在我的JavaFX应用程序中,当我对EmbeddedId类使用 Non Lazy Collection 选项时,为了保持双向关系,它将产生以下异常。经过几个小时的工作后,我仍然无法解决它。实体类如下。谢谢。 EmbeddedId类 WorkflowStep实体 (带有EmbeddedId) WfScriptTemplate实体 (带有双向关系) PostgreSQL异常 MySQL异常