JPA:请帮助理解“join fetch”

2024-01-16

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

    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 个 Business 对象,所有 4 个对象都引用同一个 Business 实例。在我的数据库中,该业务下有 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 内部只有一个 Business 实例,但重复项将保留在结果集中。这是预期的行为。您需要的行为可以通过使用 DISTINCT 子句或使用 LinkedHashSet 来过滤结果来实现:

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

它将只返回唯一的结果,保留插入顺序。

每当您尝试以有序方式急切地获取多个集合(可能还有重复的项目)时,就会发生“org.hibernate.HibernateException:无法同时获取多个包”。如果您考虑生成的 SQL,这确实有点道理。 Hibernate 无法知道重复的对象是由连接引起的还是由子表中的实际重复数据引起的。看着this http://www.jroller.com/eyallupu/entry/hibernate_exception_simultaneously_fetch_multiple以获得一个很好的解释。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA:请帮助理解“join fetch” 的相关文章

随机推荐

  • 根据匹配的行合并两个csv文件并在linux中添加新列

    我正在使用 java 开发一个应用程序 但为此我需要一个按顺序排列的 csv 文件 我对linux不太了解 但想知道是否有某种方法可以将csv文件合并为所需的格式 我有两个 csv 文件 其中包含数十万条记录 示例如下 name Direc
  • 如何列出Qt5的所有CMake组件?

    我知道在 CMake 中我可以找到并需要我需要的 Qt5 库 代码如下 find package Qt5 5 12 0 REQUIRED COMPONENTS Gui Qml QuickControls2 Svg 但我怎么知道我可以在后面列
  • 在 Fabric8 Kubernetes 客户端 events() API 的 Watcher 中,我可以监视哪些资源?

    我正在探索 无证 events API https github com fabric8io kubernetes client blob master kubernetes client src main java io fabric8
  • Qt 中区分单击事件和双击事件

    我有一个QAbstractItemView需要对单击和双击事件做出反应 根据单击还是双击 操作会有所不同 发生的问题是在双击事件之前接收到单击事件 是否有推荐的方法 最佳实践来区分两者 当用户实际双击时 我不想执行单击操作 我正在使用 Qt
  • 在内联表单集中使用 Django FileField

    在我的应用程序中上传文件时遇到问题 用户提交报告并可以添加附件 通过外键关系 我已经显示了内联表单 如果我将其留空 它就会工作 但是当我尝试上传文件然后提交表单时 我收到 500 错误 基本报告已制作 但内联的附件未保存 forms py
  • 如何调用Fragment的onResume()

    我使用了导航抽屉 其中有许多片段 我想调用fragment的onResume 我需要从服务器加载更新的数据 onResume 当你的Activity onResume 已被调用 您不必调用onResume in a Fragment 阅读本
  • Python 编码风格 - 多个返回语句[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 对于同一任务 我编写了两个不同的函数 我想知道哪一个使用起来更优雅 任务是检查一个pydot如果它看到请求的节点 则返回对象 如果是 则返回该节
  • 让 google Recaptcha 能够处理域名中的特殊字符

    我正在为域名中包含瑞典字符 的网站设置 API 密钥 http s lja io http s C3 A4lja io 但它没有初始化验证码 然后尝试使用等效 url 的 api 密钥http xn slja loa io http xn
  • android studio 模拟器无法初始化 DirectSoundCapture

    我在 android studio 3 2 中只有一个基本的 helloworld 应用程序 我正在尝试运行一些模拟器来使用 AVD 管理器测试该应用程序 但模拟器只是停留在 google 徽标中 最终 android studio 超时并
  • Android Studio 2 Beta 5 中的构建变体中测试工件选择器丢失/消失

    为了在 Android Studio 中运行 Instrumentation Tests 我通常通过 Build Variants 窗 口选择 Android Instrumentation Tests 作为要构建的测试工件 我最近升级到
  • 注入存储库上的 IDisposable

    我有以下 ADO Net 存储库 public class Repository IRepository IDisposable private readonly IUnitOfWork UnitOfWork private SqlConn
  • 使用 Ext.grid.Panel.reconfigure() 破坏网格 RowEditing 插件

    我正在创建一个 extjs 网格面板 其中有一组用户可配置的列 这Ext grid Panel http docs sencha com ext js 4 1 api Ext grid Panel组件提供了一个方便的reconfigure
  • 如何将卫星程序集(本地化资源)包含在使用 WiX 构建的 MSI 中?

    我正在从事的项目正在从使用 VS2008 部署 安装程序切换到 WiX 我目前对 WiX 还很陌生 我添加了将资源项目的输出复制到 Resources dll 中的代码 但在旧的 VS2008 安装程序文件系统中 还存在本地化资源输出 该输
  • 调用 mouseClicked() 后 JComponent 消失

    我正在用 Swing 编写一个 Java GUI 程序 界面如下所示 当用户单击右侧的其中一张图片时 我希望在左上角的橙色区域中显示它的小预览 我通过以下方式从计算机上的目录中提取所有图像文件SwingWorker线程 http docs
  • 无法打开登录请求的服务器

    我正在尝试使用 pyodbc 连接到我的 Azure SQL 数据库 我正在使用的azure帐户位于用户名下 电子邮件受保护 cdn cgi l email protection 我的大学帐户 当我尝试连接到数据库时 出现错误 Cannot
  • 如何在轮子中包含和安装测试文件并部署到 Databricks

    我正在开发一些在 Databricks 上运行的代码 鉴于 Databricks 无法在本地运行 我需要在 Databricks 集群上运行单元测试 问题是当我安装包含我的文件的轮子时 测试文件永远不会安装 如何安装测试文件 理想情况下我想
  • 如何在使用 VS Code 调试之前执行批处理文件

    我正在使用 Typescript nodeJS 和 VS Code 进行开发 使用 VS Code 进行调试 我的配置中有launch json type node request launch name Launch via NPM ru
  • 如何在 WPF ListView 中查看最后添加的列表视图项

    我正在使用视图模型绑定到列表视图 每次我在视图模型内部可观察集合中添加一个项目时 我都会使用 list Count 1 触发 LastIndex 属性 列表视图绑定到 VM 的 LastIndex 属性 并且列表视图正确选择添加到视图的最后
  • Typescript getter 和 setter 错误

    好吧 这是我第一天使用 typescript 做一些 Angular 2 我尝试制作一个简单的 getter 和 setter 服务 import Injectable from angular2 core Injectable expor
  • JPA:请帮助理解“join fetch”

    我有以下实体结构 业务 gt 营销活动 gt 促销 其中一个业务可以有许多营销活动 一个营销活动可以有许多促销活动 两个一对多关系都被声明为 LAZY 在我的代码中的一处 我需要急切地从 Business 中获取这两个集合 所以我这样做 Q