在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException在启动时遇到了问题。 根据spring-data文档中使用@Query的示例50,可以指定查询本身和countQuery,如下所示:
org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
@Query
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查询:
NativeJpaQuery
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参数,所以hasPagingOrSortingParameter是true的,但它也在寻找#pageable或#sort序列里面queryString,我不提供。
Pageable
hasPagingOrSortingParameter
true
#pageable
#sort
queryString
我尝试#pageable在查询末尾添加(这是一条注释),这使验证通过,但随后执行失败,表示查询需要一个附加参数:3而不是2。
有趣的是,如果我在运行时手动containsPageableOrSortInQueryExpression从更改false为true,则查询工作正常,因此我不知道为什么要检查该字符串是否在我自己的位置,queryString而且我也不知道如何提供它。
containsPageableOrSortInQueryExpression
false
任何帮助将非常感激。
我遇到了一个同样的问题:我发现使用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”注释周围的换行符来避免预期参数数量上的运行时错误(解决方法)。我希望这个错误会尽快修复…
Page<Author>