一尘不染

带分页的Spring数据和本机查询

spring

在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException在启动时遇到了问题。
根据spring-data文档中使用@Query的示例50,可以指定查询本身和countQuery,如下所示:

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);
}

出于好奇,在NativeJpaQuery课堂上我可以看到它包含以下代码来检查其是否为有效的jpa查询:

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参数,所以hasPagingOrSortingParametertrue的,但它也在寻找#pageable#sort序列里面queryString,我不提供。

我尝试#pageable在查询末尾添加(这是一条注释),这使验证通过,但随后执行失败,表示查询需要一个附加参数:3而不是2。

有趣的是,如果我在运行时手动containsPageableOrSortInQueryExpression从更改falsetrue,则查询工作正常,因此我不知道为什么要检查该字符串是否在我自己的位置,queryString而且我也不知道如何提供它。

任何帮助将非常感激。


阅读 470

收藏
2020-04-11

共1个答案

一尘不染

我遇到了一个同样的问题:我发现使用Spring Data的示例50作为解决我需要使用分页进行本机查询的解决方案,但是Spring在启动时抱怨我无法对本机查询使用分页。

我只是想报告一下,我成功使用分页,并使用以下代码成功运行了所需的本机查询:

    @Query(value="SELECT a.* "
            + "FROM author a left outer join mappable_natural_person p on a.id = p.provenance_id "
            + "WHERE p.update_time is null OR (p.provenance_name='biblio_db' and a.update_time>p.update_time)"
            + "ORDER BY a.id \n#pageable\n", 
        /*countQuery="SELECT count(a.*) "
            + "FROM author a left outer join mappable_natural_person p on a.id = p.provenance_id "
            + "WHERE p.update_time is null OR (p.provenance_name='biblio_db' and a.update_time>p.update_time) \n#pageable\n",*/
        nativeQuery=true)

public List<Author> findAuthorsUpdatedAndNew(Pageable pageable);

需要使用countQuery(在代码块中注释掉)Page<Author> 作为查询的返回类型,需要使用“ #pageable”注释周围的换行符来避免预期参数数量上的运行时错误(解决方法)。我希望这个错误会尽快修复…

2020-04-11