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 注释进行排序,以免获得包语义。