执行本机查询时,Hibernate要快得多

Hap*_*eer 3 java hibernate hql

以下查询应该返回大约800个对象.问题是hibernate实际上执行了800个查询来获取它们.它似乎执行一个查询来获取id,然后为每个对象执行一个查询以获取有关该对象的特定数据.此查询返回需要60秒以上.

List<AUser> result = em.createQuery("FROM AUser where company=:companyId")
.setParameter("companyId",company.getId())
.getResultList();
Run Code Online (Sandbox Code Playgroud)

本机查询要快得多.

List<AUser> result = em.createNativeQuery("select a.* FROM AUser a where a.company=:companyId")
.setParameter("companyId",company.getId())
.getResultList();
Run Code Online (Sandbox Code Playgroud)

上述查询返回时间不到一秒.

为什么不同?

Chs*_*y76 6

原始问题是由AUser急切获取的财产(由HappyEngineer在评论中确认)引起的.

回答后续问题:

通常,最好的方法是将关联映射为惰性:

@ManyToOne(fetch = FetchType.LAZY)
private Company company;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用join fetch以下命令覆盖查询中的提取模式:

select user
  from AUser user left join fetch user.company
 where user.company.id = :companyId
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅Hibernate文档中的" 关联和联接"一章.