在一个web项目中,我正在使用最新的spring-data(1.10.2)与MySQL 5.6数据库,并尝试使用本地查询进行分页,但是在启动时遇到了org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
异常。
更新:20180306 此问题现在在Spring 2.0.4中已修复。对于那些仍然感兴趣或被困在旧版本中的人,请查看相关答案和评论以获取解决方法。
根据spring-data文档中的示例50-使用@Query,可以通过指定查询本身和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
序列,而我没有提供它。
我尝试在查询末尾添加 #pageable
(它是一个注释),这样验证就会通过,但在执行时会失败,说查询需要一个额外的参数:3 而不是 2。
有趣的是,如果我在运行时手动将 containsPageableOrSortInQueryExpression
从 false
改为 true
,则查询工作正常,因此我不知道为什么它要检查该字符串是否在我的 queryString
中,并且我不知道如何提供它。
任何帮助将不胜感激。
更新于 2018 年 01 月 30 日 看起来,spring-data 项目的开发人员正在使用 Jens Schauder 的PR 修复此问题。
@Param("lastname")
注解,问题出在WHERE LASTNAME = \":lastname\"
,这里的双引号是不必要的。因此,问题是我简单地忘记从SQL参数中删除双引号。 - lechat#pageable
,但请确保您的Pageable参数已指定了Sort,否则它将被忽略。 - undefined