带分页的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参数,所以hasPagingOrSortingParametertrue的,但它也在寻找#pageable#sort序列里面queryString,我不提供。

我尝试#pageable在查询末尾添加(这是一条注释),这使验证通过,但随后执行失败,表示查询需要一个附加参数:3而不是2。

有趣的是,如果我在运行时手动containsPageableOrSortInQueryExpression从更改falsetrue,则查询工作正常,因此我不知道为什么要检查该字符串是否在我自己的位置,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

回到顶部