Java 为什么带分页的spring nativeQuery抛出SQLGrammarException?
我试图在Spring 4.2.4中运行以下查询:Java 为什么带分页的spring nativeQuery抛出SQLGrammarException?,java,spring,hibernate,spring-data,nativequery,Java,Spring,Hibernate,Spring Data,Nativequery,我试图在Spring 4.2.4中运行以下查询: @Query(value="SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY i.TYPE_NUMBER ASC) AS RN, i.* FROM Item i) AS g WHERE RN between ?#{ #pageable.offset} and ?#{#pageable.offset + #pageable.pageSize}", countQuery="SELECT
@Query(value="SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY i.TYPE_NUMBER ASC) AS RN, i.* FROM Item i) AS g WHERE RN between ?#{ #pageable.offset} and ?#{#pageable.offset + #pageable.pageSize}",
countQuery="SELECT count(i.ID) FROM Item i",
nativeQuery = true)
Page<Item> getItems(Pageable pageable);
这是由于:
我尝试过在没有分页的情况下运行同一个本机查询,它将在没有任何错误的情况下运行。查询如下所示:
@Query(value="SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY i.TYPE_NUMBER ASC) AS RN, i.* FROM Item i) AS g WHERE RN between 0 and 50",
nativeQuery = true)
List<Item> getItems();
这是spring数据的限制还是我遗漏了什么 我认为这是spring数据中的一个bug。如果查询包含ORDER BY,则Spring data append,即itemCategory asc。在另一种情况下,spring数据按i.itemCategory asc添加订单。作为解决方法,您可以将ORDER BY 1=1添加到查询中
@Query(value="SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY i.TYPE_NUMBER ASC) AS RN, i.* FROM Item i) AS g WHERE RN between ?#{ #pageable.offset} and ?#{#pageable.offset + #pageable.pageSize}, ORDER BY 1=1",
countQuery="SELECT count(i.ID) FROM Item i",
nativeQuery = true)
Page<Item> getItems(Pageable pageable);
该SQLGrammarException是否有原因?是的,原因如下:由com.microsoft.sqlserver.jdbc.SQLServerException引起:“,”附近的语法不正确。这仅在使用Pageable对象运行时发生。请启用sql日志以查看执行的sql@DanielKäfer谢谢。我在hibernate上启用了SQL调试,发现问题在于分页对象的动态排序:PageRequest PageRequest=new PageRequest0,25,Sort.Direction.ASC,itemCategory;使用可分页对象上的动态排序参数,Hibernate从SELECT ROW_NUMBER OVERORDER BY i.TYPE_NUMBER ASC AS RN,i.*从项目i AS g生成SELECT top 25*,其中RN介于?这里的错误非常明显。您知道如何将pageable的排序参数与本机查询一起使用吗?
@Query(value="SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY i.TYPE_NUMBER ASC) AS RN, i.* FROM Item i) AS g WHERE RN between 0 and 50",
nativeQuery = true)
List<Item> getItems();
@Query(value="SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY i.TYPE_NUMBER ASC) AS RN, i.* FROM Item i) AS g WHERE RN between ?#{ #pageable.offset} and ?#{#pageable.offset + #pageable.pageSize}, ORDER BY 1=1",
countQuery="SELECT count(i.ID) FROM Item i",
nativeQuery = true)
Page<Item> getItems(Pageable pageable);