我有一个运行时生成的JPQL作为String和一个PageAble对象。我想用Pageable运行JPQL查询。我怎么能这样做?
例如:我想要一个像运行时生成的查询字符串这样的解决方案。
@Query("select u from User u")
Page<User> findUsers(Pageable pageable);
答案 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);
请注意offset
和limit
特定于MySQL和Postgres。其他数据库产品可能有不同的语法。