java - Hibernate 在执行 native 查询时要快得多

标签 java hibernate hql

以下查询应该返回大约 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/

相关文章:

java - 在 ForkJoinpool 上使用 CompletableFuture 并避免线程等待

java - Java 中的计算不等于预期结果

java - 按下后退按钮 session 不会破坏

java - Spring 4 : @async nativeQuery running before the calling @transactional transaction commits

NHibernate:在 HQL 中返回常量

java - 查询语法异常 : with-clause not allowed on fetched associations; use filters

java - 需要帮助来理解字符串长度逻辑

java - 为什么我的数据库仅在前两个 jsp 表单提交时更新成功?

java - Hibernate,更新表单bean给出错误?

sql - 如何在HQL查询中传递参数