【发布时间】:2016-11-15 22:30:51
【问题描述】:
在一个 web 项目中,使用最新的 spring-data (1.10.2) 和 MySQL 5.6 数据库,我正在尝试使用带有分页的本机查询,但我在启动时遇到了 org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException。
更新:20180306 此问题现已在Spring 2.0.4 中修复。对于那些仍然感兴趣或坚持使用旧版本的用户,请查看相关答案和 cmets 以了解解决方法。
根据Example 50 at Using @Query from spring-data documentation,可以指定查询本身和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,但它也在queryString 中寻找#pageable 或#sort 序列,我没有提供。
我尝试在查询末尾添加#pageable(这是一条注释),这使验证通过,但随后执行失败,说查询需要一个额外的参数:3 而不是 2。
有趣的是,如果我在运行时手动将 containsPageableOrSortInQueryExpression 从 false 更改为 true,则查询工作正常,所以我不知道为什么它会检查该字符串是否位于我的 queryString 和我不知道如何提供。
任何帮助将不胜感激。
2018 年 1 月 30 日更新 spring-data 项目的开发人员似乎正在通过PR by Jens Schauder 解决此问题
【问题讨论】:
-
不,我还没有找到解决方案。我在 Spring JIRA 中创建了一张票,但没有回复:jira.spring.io/browse/DATAJPA-928。最后,我不需要分页,所以我没有尝试进一步调查或用那张票更努力地推动。
-
好的,谢谢。作为一种解决方法,您可以添加“\n#pageable\n”而不是“#pageable”,但我希望它会在未来得到修复。
-
当前的修复让我的情况变得更糟。现在我的 PageAble 参数被完全忽略,查询无限执行。因此,如果您插入了该 \n#pageable\n 解决方法,请确保将其删除,否则您会遇到麻烦。
标签: spring spring-data spring-data-jpa