org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

2024-02-10

以下是我的代码,我使用多个列表从数据库中获取数据。 从 hql 查询获取数据时显示异常。

波乔级

public class BillDetails implements java.io.Serializable {

private Long billNo;
// other fields
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillPaidDetails> billPaidDetailses = new ArrayList<BillPaidDetails>();
private Set productReplacements = new HashSet(0);
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillProduct> billProductList = new ArrayList<BillProduct>();
//getter and setter
}

hmb.xml 文件

<class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop">
        <id name="billNo" type="java.lang.Long">
            <column name="bill_no" />
            <generator class="identity" />
        </id>
 <bag name="billProductList" table="bill_product" inverse="true" lazy="false" fetch="join">
            <key>
                <column name="bill_no" not-null="true" />
            </key>
            <one-to-many class="iland.hbm.BillProduct" />
        </bag>
        <bag name="billPaidDetailses" table="bill_paid_details" inverse="true" lazy="false" fetch="select">
            <key>
                <column name="bill_no" not-null="true" />
            </key>
            <one-to-many class="iland.hbm.BillPaidDetails" />
        </bag>
        <set name="productReplacements" table="product_replacement" inverse="true" lazy="false" fetch="join">
            <key>
                <column name="bill_no" not-null="true" />
            </key>
            <one-to-many class="iland.hbm.ProductReplacement" />
        </set>
    </class>

总部查询

String hql = "select distinct bd,sum(bpds.amount) from BillDetails as bd "
                    + "left join fetch bd.customerDetails as cd "
                    + "left join fetch bd.billProductList as bpd "
                    + "left join fetch bpd.product as pd "
                    +"left join fetch bd.billPaidDetailses as bpds "
                    + "where bd.billNo=:id "
                    + "and bd.client.id=:cid ";

我正在尝试按照以下查询从数据库中获取数据,但这显示org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags如何解决这个问题


Hibernate 不允许获取多个包,因为这会生成笛卡尔积 http://en.wikipedia.org/wiki/Cartesian_product.

现在,您会发现很多答案、博客文章、视频或其他资源告诉您如何使用Set代替List为您的收藏。

这是个糟糕的建议!

Using Sets代替Lists将使MultipleBagFetchException消失,但笛卡尔积仍然存在。

正确的修复

而不是使用多个JOIN FETCH在单个 JPQL 或 Criteria API 查询中:

List<Post> posts = entityManager.createQuery("""
    select p
    from Post p
    left join fetch p.comments
    left join fetch p.tags
    where p.id between :minId and :maxId
    """, Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.getResultList();

您可以执行以下技巧:

List<Post> posts = entityManager.createQuery("""
    select distinct p
    from Post p
    left join fetch p.comments
    where p.id between :minId and :maxId
    """, Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();

posts = entityManager.createQuery("""
    select distinct p
    from Post p
    left join fetch p.tags t
    where p in :posts
    """, Post.class)
.setParameter("posts", posts)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();

只要您使用最多获取一个集合JOIN FETCH, 你会好起来的。通过使用多个查询,您将避免使用笛卡尔积,因为除了第一个集合之外的任何其他集合都是使用辅助查询获取的。

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

org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包 的相关文章

  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • Hibernate.createBlob() 方法从 Hibernate 4.0.1 开始已弃用,并移至 Hibernate.getLobCreator(Session session).createBlob()

    Method Hibernate createBlob 已弃用自休眠4 0 1并搬到Hibernate getLobCreator Session session createBlob 任何解决方案我应该在方法内传递什么getLobCrea
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 将 lambda 或 api 网关的访问限制为特定 vpc

    是否有可能制作一个API网关 or lambda只能由特定 vpc 访问的功能 我在亚马逊文档中搜索 但没有找到有关此主题的任何内容 先感谢您 不幸的是 您将无法做到这一点 请参阅下面的更新 s3 是通过以下方式提供这种控制访问的服务桶策略
  • 如何强制Apache使用手动预压缩的CSS和JS文件的gz文件?

    我有一个简单的问题 我有网络目录 css里面是文件style css 我已手动压缩此文件并将其另存为style css gz 我想节省 CPU 周期 以免在每次请求时都压缩 CSS 文件 如何配置 Apache 来查找此内容 gz归档并提供
  • Sinatra 测试总是 404'ing

    我有一个非常简单的 Sinatra 应用程序 但在测试时遇到了问题 基本上 当我从浏览器中的测试得知该请求工作正常时 每个请求测试都会返回 404 关于问题可能是什么的任何想法吗 测试助手 rb ENV RACK ENV test lt l
  • Zend 2 数据库事务?

    我们如何在 Zend 2 中使用事务 我在 API 中没有找到任何内容 Zend 1 的几个问题涉及常规 PDO 函数 但我在 Zend 2 中没有看到类似的内容 ZF2 这个部门的文档有点缺乏 开始交易 this gt adapter g
  • Javascript - 记住选择的选项

    我有一个通过 javascript 注入创建的网页 其中一个页面有一个下拉列表 如下所示 html
  • 我们应该在哪里使用@Transactional,Service层在哪里?

    我在 Spring 中有休息风格的控制器 在控制器中我注入了 dao 接口 我从控制器保存数据 换句话说 我有 REST Web 服务 人们向我发送数据 我保留它 Payment rest controller which receives
  • 自动热键窗口出现事件

    我正在使用 WorkRave 休息提醒 并希望在休息窗口出现时关闭屏幕 我知道如何将其关闭 如何在指定窗口 IfWinActive ahk class 出现时创建事件 另外 我可以绑定 符号吗 不起作用 而是其他的 要获得出现窗口的即时通知
  • Laravel 会话存储未根据请求设置

    我正在开发一个小型网站 并且在会话方面遇到问题 当我尝试登录或进行 AJAX 调用时 出现以下 RuntimeException RuntimeException in Request php line 758 Session store
  • 如何避免在信号处理程序中使用 printf?

    Since printf不可重入 在信号处理程序中使用它不应该是安全的 但我见过很多使用的示例代码printf这边走 所以我的问题是 我们什么时候需要避免使用printf在信号处理程序中 是否有推荐的替代品 主要问题是如果信号中断mallo
  • 我应该在 ViewHolder 中哪里取消绑定 ButterKnife 8.x.x?

    我有一个使用 ButterKnife 注释的 RecycleView ViewHolder 类 我的代码也应该在这个 ViewHolder 类中 unbind 吗 public class AView extends RecyclerVie
  • 填写缺失值

    伙计们 我有这张桌子 stime datetime svalue 1 13 2014 8 40 00 AM 5 1 13 2014 8 45 00 AM 6 1 13 2014 8 46 00 AM 5 1 13 2014 8 50 00
  • 在 Android 中,如何更改 onOptionsItemSelected() 内不同 MenuItem 的标题

    单击 Android 中选项菜单中的某个 MenuItem 时 我需要更改同一菜单中不同 MenuItem 的标题 有什么方法可以做到这一点 当单击选项菜单中的 MenuItem 时 将调用 onOptionsItemSelected Me
  • OpenCL 本地内存大小和计算单元数量

    每个 GPU 设备 AMD NVidea 或任何其他 都分为多个计算单元 多处理器 每个计算单元都有固定数量的内核 顶点着色器 流处理器 所以 一个人有 Compute Units x VertexShaders compute unit
  • 如何在java中使用math.pi

    我在转换此公式时遇到问题V 4 3 r 3 我用了Math PI and Math pow 但我收到此错误 预期的 此外 直径变量不起作用 那里有错误吗 import java util Scanner import javax swing
  • 有没有办法将 SQL 数据库链接到 LDAP 服务器

    我们有一个 SQL 联系人数据库 它链接到我们所有的项目信息 其中包含很多附加功能 最近有人建议我们在最终用户的电子邮件客户端中提供此信息的联系人部分 因此我们正在考虑设置 LDAP 服务器 是否有任何工具可以让我们将数据库中的信息 可能是
  • 如何使用 R 和 dplyr 连接不同 SQL 数据库中的表?

    我在用着dplyr 0 7 0 dbplyr 1 0 0 DBI 0 6 1 and odbc 1 0 1 9000 我想做如下的事情 db1 lt DBI dbConnect odbc odbc Driver SQL Server Ser
  • 如何将外部数据库连接到AppEngine?

    有没有什么方法 比使用更好UrlFetch 连接到任何外部数据库来自应用程序引擎 我已经了解托管 SQL 数据库商业应用引擎 http code google com appengine business 但它们不是免费的 并将在 2011
  • numpy.ndarray 枚举维度的真子集?

    在这篇文章中 让np可以简写为numpy Suppose a is a n k 维np ndarray对象 对于某些整数n gt 1 和k gt 1 哎呀 n k gt 3 的值是a ndim 我想列举一下a超过它的第一个n方面 这意味着
  • opencl中的时钟()

    我知道CUDA中有一个函数clock 你可以在其中放入内核代码并查询GPU时间 但我想知道OpenCL中是否存在这样的东西 有没有办法查询OpenCL中的GPU时间 我正在使用 NVIDIA 的工具包 OpenCL 没有直接查询时钟周期的方
  • org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包

    以下是我的代码 我使用多个列表从数据库中获取数据 从 hql 查询获取数据时显示异常 波乔级 public class BillDetails implements java io Serializable private Long bil