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:无法同时获取多个包 的相关文章

随机推荐

  • 将 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