Java 弹簧靴&x2B;冬眠+;SqlAzure分页问题

Java 弹簧靴&x2B;冬眠+;SqlAzure分页问题,java,spring,hibernate,azure,pagination,Java,Spring,Hibernate,Azure,Pagination,我有一个使用hibernate作为ORM的JavaSpring启动应用程序。该数据库是Azure SQL Server 我已经在供应商适配器配置上启用了setShowSql 当我想查找对象时,我使用了TypedQuery的方法setFirstResult和setMaxResults,然后调用getResultList方法 控制台中打印的查询不包含OFFSET和ROW FETCH子句,而且Hibernate似乎首先检索所有结果,然后对结果列表应用分页 这显然会导致性能问题 我哪里做错了 下面我报告

我有一个使用hibernate作为ORM的JavaSpring启动应用程序。该数据库是Azure SQL Server

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

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

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

这显然会导致性能问题

我哪里做错了

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

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

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

  • 您必须使用org.hibernate.dial.SQLServer2012Dialect或任何未来的2012+版本
  • 您的查询必须包含一个
    ORDER BY
    子句
  • 您的查询没有执行
    TOP
    子句查询
  • SQLServer2012Dialect
    使用一个名为
    SQLServer2012LimitHandler
    的定制
    LimitHandler实现,您可以看到它显式地处理这个用例,或者返回到旧的行为


    如果上述两个需求都得到了满足,但由于某种原因,逻辑仍然回到了原来的行为,那么这就是一个bug。在这种情况下,您可能应该使用测试用例进行更新,以便我们能够修复它。

    您使用的是哪种方言?您的查询是否包含一个
    orderby
    片段,或者结果是无序的?我用所有方言都试过了。我使用的实际方言是org.hibernate.dialogue.sqlserverdialogue。关于ordeer by fragment,是的,我已经包括了它,并在打印的查询中看到了它。今天我尝试了hibernate的最新稳定版本,但结果是一样的。谢谢!!我的问题在于Spring配置。当我将hibernate.version属性设置为5.2.12.Final时,它工作得很好!