当前位置: 首页 > 面试题库 >

JPA:请帮助理解“ join fetch”

吕琪
2023-03-14
问题内容

我具有以下实体结构:业务->广告活动->促销,其中一个业务可以有多个广告活动,一个业务可以具有多个促销。一对多关系都声明为LAZY。在我的代码中的一个地方,我需要从业务部门急切地获取两个集合,所以我这样做:

    Query query = entityManager.createQuery("select b from Business b " +
            "left join fetch b.campaigns c " +
            "left join fetch c.promotions where b.id=:id");
query.setParameter("id", b.getId());
business = (Business) query.getResultList().get(0);

但是,查询返回的结果列表中包含4个业务对象,所有4个对象都引用同一个业务实例。在我的数据库中,该公司下有3个广告活动,而这3个广告活动下都有3个广告活动。

我有两个问题:

  1. 首先,我使用List来包含关系的许多方面,但是当程序运行时,我收到“ org.hibernate.HibernateException:无法同时获取多个包”的异常。然后,我用谷歌搜索了这个异常,看起来我必须使用Set而不是List。因此,我将集合更改为Set并开始工作。有人可以告诉我为什么List在这种情况下不起作用吗?

  2. 我期望查询返回单个结果,因为它是针对作为主键的id进行查询,因此应该仅返回单个结果。但事实证明,它在一个List中返回4个实例。这有问题吗?还是这种预期的行为?

任何帮助将不胜感激。


问题答案:

生成的sql如下所示:

select * from Business b 
left outer join campaigns c on c.business_id = b.id
left join promotions  p on p.campaign_id = c.id
where b.id=:id

在内部,Hibernate将只有一个业务实例,但是重复项将保留在结果集中。这是预期的行为。可以通过使用DISTINCT子句或通过使用LinkedHashSet来过滤结果来实现所需的行为:

Collection result = new LinkedHashSet(query.getResultList());

只会html" target="_blank">返回唯一的结果,并保留插入顺序。

每当您尝试以有序的方式(甚至可能重复的项目)急切地获取多个集合时,就会发生“
org.hibernate.HibernateException:无法同时获取多个包”的情况。如果考虑生成的SQL,这确实很有意义。Hibernate无法知道重复的对象是由联接还是由子表中的实际重复数据引起的。看看这个有一个很好的解释。



 类似资料:
  • 我在Geeksforgeks中解决问题,突然发现了这个问题。我理解“Integer.compare”的用法,但无法理解“Integer.compare”的用法-

  • 我在GeeksforGeeks解决问题,突然得到了这个。我理解“Integer.compare”的用法,但无法理解“-

  • 我有一个linq查询,我在foreach循环中迭代其结果。 第一个是一个从表布局面板中获取控件集合的查询,然后我遍历该集合并从表布局面板中删除控件,因此: 上面的操作并不像我预期的那样(即抛出一个错误),它只删除了一半的控件(奇数的控件)。似乎在每次迭代中,AllItems都会减少其自身,尽管底层集合正在修改,但不会抛出错误。 如果使用字符串数组执行Similar: 这次Visual studio

  • 色彩管理系统可以统一不同设备之间的颜色差异,使您能够可靠地预测系统最终生成的颜色。正确的查看颜色使您可以在从数字捕捉到最终输出的工作流程中使用口述颜色定义即可。通过色彩管理,还可创建基于 ISO、SWOP 和 Japan Color 打印生产标准的的输出。 为什么色彩有时候不匹配 在出版系统中,没有哪种设备能够重现人眼可以看见的整个范围的颜色。每种设备都使用特定的色彩空间,此色彩空间可以生成一定范

  • 我目前正在做一个项目,我们必须从UML图制作代码。我了解UML类图的解剖结构,但我无法理解什么

  • 本文向大家介绍深入理解mysql帮助命令(help),包括了深入理解mysql帮助命令(help)的使用技巧和注意事项,需要的朋友参考一下 在安装、管理和使用mysql过程中,你是不是需要记忆很多的mysql命令。而且对于新手来说,很不多的命令不知道该如何应用,对于老手来说很多命令时间长了忘记具体的用法。 其实mysql的帮助信息,已经给我们提供很全面的使用方法。 下面我就大致介绍下,如何使用my