在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图使用带有分页的本机查询,但org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
在启动时遇到了问题。
更新:20180306此问题已在Spring 2.0.4中修复。对于仍对旧版本感兴趣或仍在使用旧版本的人,请查看相关答案和评论以找到解决方法。
根据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
参数,所以hasPagingOrSortingParameter
是true
的,但它也在寻找#pageable
或#sort
序列里面queryString
,我不提供。
我尝试#pageable
在查询末尾添加(这是一条注释),这使验证通过,但随后执行失败,表示查询需要一个附加参数:3而不是2。
有趣的是,如果我在运行时手动containsPageableOrSortInQueryExpression
从更改false
为true
,则查询工作正常,因此我不知道为什么要检查该字符串是否在我自己的位置,queryString
而且我也不知道如何提供它。
任何帮助将非常感激。
更新2018 年1月30日似乎spring-data项目的开发人员正在通过Jens Schauder的PR来解决此问题。