【问题标题】:Spring Data JPA, how to get the last Page through PageableSpring Data JPA,如何通过Pageable获取最后一页
【发布时间】:2015-07-31 07:47:29
【问题描述】:

我想获取一个实体的最后 5 条记录。但无法通过 Spring Data JPA 获取。

最初我试图通过 LIMIT 查询获取数据,但 JPA 不支持 LIMIT。

后来我尝试了Pageable接口。

Pageable pageCount = new PageRequest(0, 10, Direction.ASC,"id");
List<TxnEntity> txnEntities = txnDAO
            .findByAccountEntity(accountEntity,pageCount);

这给了我 10 个对象的第一页。

但我的要求是获得最后 10 或 5 个对象。那么如何通过Spring框架中的Pageable接口获取呢?

【问题讨论】:

  • 先确定总量,减去你需要的记录数,构造一个对象。
  • Pageable pageCount = new PageRequest(0, 10, Direction.DESC, 'Id"); ?

标签: java spring hibernate jpa


【解决方案1】:

来自参考文档:

要完全了解您为一个查询获得了多少页,您必须触发一个额外的计数查询。默认情况下,此查询将派生自您实际触发的查询。

您可以通过提前发出计数查询来确定页数:

Long count = txnDAO.countByAccountEntity(accountEntity);
Pageable pageCount = new PageRequest((int)count/10, 10, Direction.ASC,"id");

【讨论】:

  • 上述解决方案仅在 count 是 10 的精确倍数时有效。例如。一世。如果 count 为 30,那么我将 pageRequest 获取为 (Number: 3, size: 10, Direction.ASC,"id");这给了我 10 个对象,如预期的那样是最后 10 个。但是 ii。如果计数为 27,那么我将 pageRequest 获取为 (Number: 2, size: 10, Direction.ASC,"id");它只给了我 7 个元素,但预计是最后 10 个。
【解决方案2】:

我期待的输出是最后 n 条记录。

所以我使用了 Spring Data JPA 1.7 内置查询

int n = 10;

Pageable pageCount = new PageRequest(0, n);

List<TxnEntity> txnEntities = txnDAO
        .findByAccountEntityOrderByIdDesc(accountEntity,pageCount);

现在这将返回最后 n 条记录。

DAO 会按降序返回所有记录,通过使用 Pageable 我们可以从底部开始需要多少条记录。

很简单。

更多 JPA 查询内置查询:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/

【讨论】:

    【解决方案3】:

    你可以反转你的排序,然后得到前 5 个。

    【讨论】:

      【解决方案4】:

      仅供参考:

      根据http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result

      您还可以在您的存储库中创建一个方法findTop5ByAccountEntityOrderByIdDesc(accountEntity)。我更喜欢这个带有额外计数查询的解决方案。

      如果你愿意,也可以加上Pageable参数,但是没有多大意义。

      但是,那里有几个潜在的问题: id 不是查找“最后”条目的自然方法。它总是会为您提供相同的结果,但取决于生成策略和可能缓存 id 的方式,不能保证最后一个“保存”的实体具有最高的 ID。这可能适用于 90% 的情况,但您应该谨慎行事。

      这是,你打算做什么?

      【讨论】:

        猜你喜欢
        • 2021-11-29
        • 2018-01-15
        • 2012-05-18
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多