以下查询应该返回大约 800 个对象。问题是 hibernate 实际上执行了 800 个查询来获取它们。它似乎执行一个查询以获取 ID,然后对每个对象执行一个查询以获取有关该对象的特定数据。此查询需要 60 多秒才能返回。
List<AUser> result = em.createQuery("FROM AUser where company=:companyId")
.setParameter("companyId",company.getId())
.getResultList();
原生查询要快得多。
List<AUser> result = em.createNativeQuery("select a.* FROM AUser a where a.company=:companyId")
.setParameter("companyId",company.getId())
.getResultList();
上面的查询不到一秒就返回了。
为什么不同?
最佳答案
最初的问题是由 AUser
的属性被急切获取引起的(由 HappyEngineer 在评论中确认)。
回答后续问题:
通常,最好的方法是将关联映射为惰性:
@ManyToOne(fetch = FetchType.LAZY)
private Company company;
然后,您可以使用 join fetch
覆盖查询中的提取模式:
select user
from AUser user left join fetch user.company
where user.company.id = :companyId
参见 Associations and Joins有关详细信息,请参阅 Hibernate 文档中的章节。
关于java - Hibernate 在执行 native 查询时要快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1842446/