Spring Data JPA,如何通过Pageable获取最后一页

12

我希望获取一个实体的最后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接口实现呢?


首先确定总数,减去所需的记录数并构造一个对象。 - M. Deinum
2
Pageable pageCount = new PageRequest(0, 10, Direction.DESC, "Id"); - redge
4个回答

5

从参考文档中得知:

要完全查询到您的查询有多少页,您需要触发一个额外的计数查询。默认情况下,此查询将从您实际触发的查询派生。

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

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

1
以上解决方案仅在计数是10的精确倍数时有效。例如,如果计数为30,则我将获得pageRequest为(数字:3,大小:10,Direction.ASC,“id”),这将按预期提供最后10个对象。但是,如果计数为27,则我将获得pageRequest为(数字:2,大小:10,Direction.ASC,“id”),这只会给我7个元素,但预期的是最后10个。 - virsha

4
我期望的输出是最近的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/

2
你可以将排序方式反转,然后获取前5个。

0

仅供参考:

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

您还可以在存储库中创建一个方法findTop5ByAccountEntityOrderByIdDesc(accountEntity)。我更喜欢这种解决方案,而不是使用额外的计数查询。

如果您愿意,也可以添加Pageable参数,但这没有太多意义。

然而,这里存在一些潜在问题:id不是找到“最后”条目的自然方式。它总是给出相同的结果,但根据生成策略和潜在缓存的id的方式,不能保证“保存”的实体具有最高的ID。这在90%的情况下可能有效,但您应该谨慎对待。

这是您打算做的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接