在一个网络项目中,使用最新的 spring-data (1.10.2) 和 MySQL 5.6 数据库,我尝试使用带分页的本机查询,但我遇到了org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
在启动时。
UPDATE:20180306 此问题现已修复春季2.0.4 https://jira.spring.io/browse/DATAJPA/fixforversion/16650/?selectedTab=com.atlassian.jira.plugins.jira-development-integration-plugin:release-report-tabpanel对于那些仍然感兴趣或坚持使用旧版本的人,请检查相关答案和评论以获取解决方法。
根据spring-data 文档中使用 @Query 的示例 50 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-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
is true
,但它也在寻找#pageable
or #sort
内的序列queryString
,我不提供。
我尝试过添加#pageable
(这是一条注释)在我的查询末尾,这使得验证通过,但随后,它在执行时失败,表示查询需要一个附加参数:3 而不是 2。
有趣的是,如果我手动更改containsPageableOrSortInQueryExpression
from false
to true
运行时,查询工作正常,所以我不知道为什么它要检查该字符串是否在我的位置queryString
我不知道如何提供它。
任何帮助将非常感激。
更新 01/30/2018spring-data 项目的开发人员似乎正在努力解决这个问题延斯·肖德 (Jens Schauder) 的公关 https://github.com/spring-projects/spring-data-jpa/pull/246