我正在编写标准 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?这可能吗?我需要创建一个单独的查询吗?
提前致谢。