问题描述
我有以下模型:
public class BaseModel {
List<DataA> lazyCollectionA;
List<DataB> lazyCollectionB;
}
public class DataA {
OtherEntity otherEntity;
}
public class OtherEntity {
List<DataC> lazyCollectionC;
}
当我访问特定页面时,我需要使用所有这些数据。这正在创建一个性能选择n + 1问题。
我已经通过使用以下方法热切地获取了收藏集,从而部分解决了该问题:
List<BaseModel> result = entityManager.createQuery(
"select m from BaseModel m " +
"left join fetch m.lazyCollectionA " +
"where m.id in (:ids) ",BaseModel.class)
.setParameter("ids",ids)
.getResultList();
result = entityManager.createQuery(
"select m from BaseModel m " +
"left join fetch m.lazyCollectionB " +
"where m.id in (:ids) ",ids)
.getResultList();
请注意,我必须执行2个查询而不是仅执行1个查询,否则我将得到一个MultipleBagFetchException
。
但是,我在急切加载lazyCollectionA.otherEntity.lazyCollectionC
时遇到了问题。我尝试了几种查询变体来尝试热切地获取结果,但是当访问otherEntity.lazyCollectionC
时,select n + 1问题不断出现。
我认为这应该可行,但不幸的是,它不是:
entityManager.createQuery(
"select a from BaseModel m " +
"left join m.lazyCollectionA a " +
"left join fetch a.otherEntity o " +
"left join fetch o.lazyCollectionC " +
"where m.id in (:ids) ",ids)
.getResultList();
您有什么想法为什么不起作用?
此外,我还不完全了解我的前两个要加载lazyCollectionA
和lazyCollectionB
的查询的工作方式。我的意思是,由于它们是在不同的时间加载的,所以我希望只有最后一个查询才会加载实例。是不是因为hibernate正在缓存结果,所以不需要再次查询数据库?
感谢您提供的任何帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)