如何解决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 举报,一经查实,本站将立刻删除。