【问题标题】:How to create unpaged but sorted Pageable.of(unpaged, unpaged, Sort ) to spring data jpa repository?如何创建未分页但已排序的 Pageable.of(unpaged, unpaged, Sort ) 到 spring 数据 jpa 存储库?
【发布时间】:2023-04-03 17:16:01
【问题描述】:

如何将Pageable 对象传递给仅包含排序信息的 Spring JPA 存储库? 我想要这样的东西:

Pageable pageable = PageRequest.of(null, null, Sort());

我知道它需要 int 作为 pagesize 但如果我们不能以某种方式不使用这些值并只给出一个未分页的结果

Sort.by(Sort.Direction.ASC, "age")

我们可以使用像 10001000 这样的大数字来表示页面和大小,但我不想硬编码这些值。

我也不打算为 Pageable 创建自定义 impl。

请告诉我如何实现这一目标。

提前致谢。

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa pageable


    【解决方案1】:

    根据the documentation for the current version of Spring Data JPA,您可以将Sort 直接传递给查询方法,因此您可以拥有相同查询方法的两个版本:

    • 收到Pageable 的人,在您拥有“完整”Pageable 时使用。
    • 另一个收到Sort,当您只想执行排序时使用。

    【讨论】:

    • 这是一个不错的选择,在存储库类中有两个方法。但是,如果我只想有一个以Pageable 为参数的方法怎么办?是否可以仅使用 Pageable 实现排序?
    • @MohammedIdris Pageable 是一个接口,因此您可以随时进行自己的实现。我想您可以使用org.springframework.data.domain.Unpaged 作为指导,并提供一个类似的实现来存储Sort 并通过getSort 返回它。无论如何,如果您不想进行分页,您应该考虑为什么要传递Pageable
    • 我想我可以创建一个实现,但是,为了传递Pageable 但不使用它,我已经有一个Repository 方法和Pageable,我的service class 正在使用它。我想过使用相同的方法来进行排序而无需分页。如果这不可能,我可以创建自己的 impl,或者我可以添加一个以 Sort 为参数的方法。
    • 真的不能。一旦提供了带有 isPaged=falsePageable,Pageable 中的信息就不会被 SimpleJpaRepository 类使用。如果您想始终使用 Pageable(因此使用 Sort 信息),唯一的替代方法是使用 Integer 创建一个新的。 MAX_VALUE 作为页面大小。
    • @rubensa 据我所知,Pageable 中的最大页数比 Integer.MAX_VALUE 更小
    【解决方案2】:

    如果您坚持使用现有查询,可以在查询中传递Pageable.unpaged(),然后对结果进行排序 (list.getContent().sort(Comparator.comparing(Item::getName)))。

    【讨论】:

    • 这是不可接受的,因为排序将在内存中完成,而不是在数据库级别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2012-04-12
    • 2021-07-26
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多