Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么带分页的spring nativeQuery抛出SQLGrammarException?_Java_Spring_Hibernate_Spring Data_Nativequery - Fatal编程技术网

Java 为什么带分页的spring nativeQuery抛出SQLGrammarException?

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

我试图在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 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);