微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MultipleBagFetchException - 如果我们只有一个集合

如何解决MultipleBagFetchException - 如果我们只有一个集合

有很多关于如何避免 MultipleBagFetchExeption 的信息,给出了一些答案,例如。此处:Hibernate throws MultipleBagFetchException - cannot simultaneously fetch multiple bags

我想知道我们是否需要使用多个 sql 查询,以防我们有一个带有一个嵌套集合 B 的实体 A 并且该集合有集合 C 并且集合 C 有集合 D?

我可以只使用一个 sql 查询获取包含嵌套集合的对象吗?我知道在 A -> B,C 集合的情况下,我必须使用 2 个 sql 查询来避免笛卡尔积,但在这种情况下 A -> B -> C -> DI 认为一个 sql 查询没有就足够了(以避免笛卡尔积产品)?

 return entityManager.createquery(
                "select distinct a " +
                        "from A a " +
                        "left join fetch a.B b " +
                        "left join fetch b.C c " +
                        "left join fetch c.D d " +
                        "left join fetch d.E e " +
                        "left join fetch e.F f " +
                        "where f.orderId = :orderId",A.class)
                .setParameter("orderId",orderId)
                .setHint(QueryHints.PASS_disTINCT_THROUGH,false)
                .getResultList()
                .stream()
                .findFirst();

其中 A 是我的实体,B、C、D、E、F 是嵌套集合(一对多关系),例如 A 只有一个 B 集合,B 只有一个 C 集合,C 只有一个 D 集合等等。

>

解决方法

当然你可以获取嵌套的集合。唯一的问题是,如果您使用 IMO 的多个“袋子”,则根本不应该使用。包是一个无序的集合,可能包含重复项。如果您选择 Set,即禁止重复,一切都很好,您可以随心所欲地获取加入。如果您确实必须使用 List,请确保使用 @OrderColumn 注释进行排序,以免获得包语义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。