Hibernate 解决 MultipleBagFetchException

问题描述 投票:0回答:0

我正在编写标准 api 请求来解决一些 N+1 问题。我的实体看起来像这样:

AEntity
  ...
  List<BEntity>
BEntity
  ...
  List<CEntity>
CEntity
  ...
  List<DEntity>
DEntity
  ...

当我运行查询时,hibernate 爆炸并给我这个错误消息:

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [org.company.crs.model.AEntity.bEntityList, org.company.crs.model.BEntity.cEntityList, org.company.crs.model.CEntity.dEntityList]

所有这些都来自这个看起来无辜的代码:

        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<AEntity> query = criteriaBuilder.createQuery(AEntity.class);
        Root<AEntity> conference = query.from(AEntity.class);

        Fetch<AEntity, BEntity> pages = conference.fetch(AEntity_.bEntityList, JoinType.LEFT);
        Fetch<BEntity, CEntity> blocks = pages.fetch(BEntity_.cEntityList, JoinType.LEFT);
        Fetch<CEntity, DEntity> rules = blocks.fetch(CEntity_.dEntityList, JoinType.LEFT);

        Predicate idPredicate =
            criteriaBuilder.equal(criteriaBuilder.literal(AEntity_.id), criteriaBuilder.literal(id));

        query.where(idPredicate);

        return entityManager.createQuery(query).getSingleResult();

想知道我有什么选择作为解决方法来加载 B、C 和 D 中的所有相关记录,最好使用标准 API?这可能吗?我需要创建一个单独的查询吗?

提前致谢。

java hibernate criteria hibernate-criteria criteria-api
© www.soinside.com 2019 - 2024. All rights reserved.