使用HQL

问题描述

我有以下模型:

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();

您有什么想法为什么不起作用?

此外,我还不完全了解我的前两个要加载lazyCollectionAlazyCollectionB的查询的工作方式。我的意思是,由于它们是在不同的时间加载的,所以我希望只有最后一个查询才会加载实例。是不是因为hibernate正在缓存结果,所以不需要再次查询数据库?

感谢您提供的任何帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)