【问题标题】:Spring boot + Hibernate + SqlAzure pagination issueSpring boot + Hibernate + SqlAzure 分页问题
【发布时间】:2017-12-06 17:54:31
【问题描述】:

我有一个使用休眠作为 ORM 的 java spring boot 应用程序。数据库是 Azure SQL Server。

我在供应商适配器配置上启用了 setShowSql。

当我想查找对象时,我使用了 TypedQuery 的方法 setFirstResultsetMaxResults,然后调用了 getResultList 方法。

在控制台打印的查询不包含 OFFSET 和 ROW FETCH 子句,Hibernate 似乎首先检索所有结果,然后在结果列表上应用分页。

这显然会导致性能问题。

我哪里做错了?

下面我报告我使用的示例代码。

query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
...
query.getResultList()

【问题讨论】:

  • 您使用的是哪种方言?您的查询是否还包含ORDER BY 片段或者结果是无序的?
  • 我试过所有的方言。我使用的实际方言是 org.hibernate.dialect.SQLServerDialect。关于按片段排序,是的,我已经包含并在打印的查询中看到它。今天我尝试了最新的稳定版本的hibernate,但结果是一样的。

标签: java spring hibernate azure pagination


【解决方案1】:

只有在满足以下条件时,Hibernate 才会在 SQL Server 方言下显式包含 OFFSETFETCH 子句:

  1. 您必须使用org.hibernate.dialect.SQLServer2012Dialect 或任何未来的 2012+ 版本。
  2. 您的查询必须包含ORDER BY 子句。
  3. 您的查询未执行TOP 子句查询。

SQLServer2012Dialect 使用称为SQLServer2012LimitHandler 的自定义LimitHandler 实现,您可以看到here 显式处理此用例或以其他方式回退到旧行为。

如果上述两个要求都得到满足,但由于某种原因逻辑仍然回退到旧的行为,那么这是一个错误。在这种情况下,您可能应该使用测试用例更新 HHH-12152,以便我们修复它。

【讨论】:

  • 谢谢!!我的问题出在 Spring 配置中。当我将属性 hibernate.version 设置为 5.2.12.Final 时,它运行良好!
猜你喜欢
  • 2023-03-09
  • 2017-11-10
  • 1970-01-01
  • 2018-12-28
  • 2019-03-03
  • 2021-06-28
  • 2017-06-16
  • 2021-06-15
  • 1970-01-01
相关资源
最近更新 更多