【问题标题】:How can I run a runtime generated query with Pageable in Spring Data?如何在 Spring Data 中使用 Pageable 运行运行时生成的查询?
【发布时间】:2017-01-15 09:13:03
【问题描述】:

我有一个运行时生成的 JPQL 作为字符串和一个 PageAble 对象。我想用 Pageable 运行 JPQL 查询。我该怎么做?

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

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

【问题讨论】:

  • 所以您需要创建存储库接口以使@Repository 公共接口 UserRepository extends JpaRepository{ @Query("select u from User u") Page findUsers(Pageable pageable) ; } 检查此链接petrikainulainen.net/programming/spring-framework/…
  • 我相信这是不可能的。 spring-data 内置机制都绑定到模型类型(a.k.a. User)。

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


【解决方案1】:

尝试 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。其他数据库产品可能有不同的语法。

【讨论】:

    猜你喜欢
    • 2023-02-13
    • 2018-07-16
    • 2019-06-21
    • 2019-02-05
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多