如何在Spring Data中使用Pageable运行运行时生成的查询?

时间:2016-09-07 15:28:41

标签: java spring java-8 spring-data spring-data-jpa

我有一个运行时生成的JPQL作为String和一个PageAble对象。我想用Pageable运行JPQL查询。我怎么能这样做?

例如:我想要一个像运行时生成的查询字符串这样的解决方案。

@Query("select u from User u")
Page<User> findUsers(Pageable pageable);

1 个答案:

答案 0 :(得分:0)

  

尝试1

要使用在运行时生成的查询,必须将存储库方法声明为

@Query("?1") Page<User>
findUsers(String query, Pageable pageable)

但是,在初始化应用程序上下文时会解析@Query,因此这种方法会失败,因为?1本身不是有效的JPQL表达式。

  

尝试2

如果您使用

@Query("?1", nativeQuery = true)

上下文将初始化,您将能够将生成的查询传递给方法,但Pageable参数将被忽略,因为作为方法参数传递的查询按原样使用。

所以,简而言之,不,使用Pageable无法完成您所寻找的目标。

  

尝试3

如果必须在运行时生成查询,则还必须自己执行分页。使用MySQL作为底层数据库的示例查询:

@Query("select u from user u order by last_name, first_name offset (?1 - 1) * ?2 limit ?2", nativeQuery = true)
Page<User> findUsers(int page, int pageSize);

请注意offsetlimit特定于MySQL和Postgres。其他数据库产品可能有不同的语法。