带分页的Spring数据和本机查询
在一个网络项目中,将最新的spring-data(1.10.2)与MySQL 5.6数据库一起使用,我试图将本机查询与分页一起使用,但是org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException
在启动时遇到了问题。
根据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而且我也不知道如何提供它。
任何帮助将非常感激。
回答:
我遇到了一个同样的问题:我发现使用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”注释周围的换行符来避免预期参数数量上的运行时错误(解决方法)。我希望这个错误会尽快修复…
以上是 带分页的Spring数据和本机查询 的全部内容, 来源链接: utcz.com/qa/411292.html