将数据的流映射为Page<T>。

12

最近我一直在尝试让我的资源/控制器中实现以下内容:

有一个数据流,然后将该数据流映射到页面响应

Page<SomeType> controllerMethod() {

    List<SomeType> allItems = someRepository.findAll()
                              .filter(something)
                              .collect(Collectors.toList())

    return allItems.map(...?)
}

问题:

是否有Spring中的辅助工具可以帮助我实现这个功能?

如果分页不是在数据库层面完成也是可以接受的。


1
如果你正在使用 Spring Data 存储库,你可以将返回类型设置为 Page<T>,它会自动转换。 - SrThompson
1
在数据库层面上不进行分页可能还可以,但是答案是否定的,为了性能,分页应该始终在数据库层面上完成。例如,如果你有100万行数据,难道你要一次性全部加载吗? - Huy Nguyen
你如何确定所有数据都适合一张页面?如果不行,你将如何服务于后续的页面?正如其他人所提到的,分页应该在数据库层面完成,而spring-data对此提供了支持。 - Benoit
有时您会遇到复杂的查询,仅使用数据库查询无法实现。例如,您具有瞬态属性,它们使用来自Spring的数据库数据和配置参数计算一些“复杂的内容”。然后,您需要从数据库中获取尽可能小的子集,然后执行一些自定义过滤器操作(基于瞬态属性)。对我来说唯一的问题是:如何将其放入返回的Page对象中。 - ramden
@ramden,使用支持分页的 Criteria API 不就可以实现这个吗? - Nikita Kobtsev
1个回答

32

PageImpl有从列表中创建的构造函数constructor

Page<SomeType> controllerMethod() {

    List<SomeType> allItems = someRepository.findAll()
                              .filter(something)
                              .collect(Collectors.toList())

    return new PageImpl<>(allItems);
}

1
你好,欢迎来到 Stack Overflow。请在你的回答中添加一些解释,以帮助未来的用户。 - Rishikesh Raje
谢谢。这正是我正在寻找的。 - ramden
2
@RishikeshRaje,你需要哪种解释?什么是列表?请完成一份作业。 - Nemo

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