美文网首页
记一个Spring Data JPA自定义分页查询BUG

记一个Spring Data JPA自定义分页查询BUG

作者: 赵荆州 | 来源:发表于2019-06-18 13:56 被阅读0次

官方给出的自定义分页查询的示例是这样的:

public interface UserRepository extends JpaRepository<User, Long> {
  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

然后实际执行时报错:

org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException

这是因为在使用NativeQuery时,会有这样一个验证:

public NativeJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, EvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {
   super(method, em, queryString, evaluationContextProvider, parser);
   JpaParameters parameters = method.getParameters();
   boolean hasPagingOrSortingParameter = parameters.hasPageableParameter() || parameters.hasSortParameter();
   boolean containsPageableOrSortInQueryExpression = queryString.contains("#pageable") || queryString.contains("#sort");
   if(hasPagingOrSortingParameter && !containsPageableOrSortInQueryExpression) {
       throw new InvalidJpaQueryMethodException("Cannot use native queries with dynamic sorting and/or pagination in method " + method);
   }
}

当参数中包含Pageable或者Sort时,SQL语句中必须包含#pageable,#sort。

参考了众多解决方案都无效。例如?#{#pageable},\n#pageable\。
https://stackoverflow.com/questions/38349930/spring-data-and-native-query-with-pagination

最终发现,其实只需要将#pageable合理的作为注释包含在SQL里即可。
我使用的Mysql,最终解决方案为:

public interface UserRepository extends JpaRepository<User, Long> {
  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1 /*#pageable*/",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}

我使用的是Spring boot 1.5.4,在新版本中应该此问题已经被修复了。

相关文章

网友评论

      本文标题:记一个Spring Data JPA自定义分页查询BUG

      本文链接:https://www.haomeiwen.com/subject/jzcfqctx.html