java - 如何修改 REST API 的 Spring 存储库搜索的页面类型结果?
问题描述
我有一个 HotelRepository,它有一个命名方法,它返回一个默认Page<Hotel>
项作为结果而不是列表。
我想将页面中的内容类型更改Hotel
为HotelDto
,因为 DTO 具有我想显示的自定义参数。我已经有一个将 Hotel 转换为 HotelDto 的构造函数。
我的尝试:
Page<Hotel> hotels = dao.findAll(pageRequest);
return new PageImpl<>(
hotels.getContent().stream()
.map(hotel -> new HotelListItemDto(hotel, hotel.getSupplier())).collect(Collectors.toList()),
pageRequest, hotels.getContent().size());
问题是它只处理结果的一页。当然,我可以先将所有结果作为一个列表,然后基于该列表创建一个页面,但它失去了优势Page
(我认为返回页面会提高搜索请求的性能)。
那么我应该怎么做才能保持页面优势但仍然具有自定义输出的能力呢?
解决方案
你几乎做到了:)
除非我跳过某些内容,否则您唯一需要更改的是传递给PageImpl
构造函数的大小。
而不是使用hotels.getContent().size()
(为您提供实际页面上内容的大小),您应该使用hotels.getTotalElements()
它为您提供所有可用页面中元素的总大小。
更新1:
要正确执行此操作,您应该将代码更改为:
Page<Hotel> hotels = dao.findAll(pageRequest);
return new PageImpl<>(
hotels.getContent().stream()
.map(hotel -> new HotelListItemDto(hotel, hotel.getSupplier())).collect(Collectors.toList()),
pageRequest, hotels.getTotalElements());
上面的代码将创建一个类似于页面的hotels
页面。这就是您的参数对于 PageImpl 来说足够的方式:
- 第一个参数是包含
HotelListItemDemo
新页面将具有的内容(类型)的列表。由于这只是将hotels
内容映射到另一种类型,因此元素的数量将完全相同。 - 第二个参数是页面请求,它为 PageImpl 提供有关页面大小、页面索引(如果您请求的话,可能还有顺序)的信息。
- 最后一个参数是追加查询中所有可用页面时所拥有的元素总数(方法中返回的值
hotels.getTotalElements()
)。这样,PageImpl 还可以计算hasNext()
我在评论中提到的内容。
希望这对您有所帮助。
推荐阅读
- c++ - Qt 等效于 C# 中的控制器或 gui 元素的泛化
- email - 逻辑应用程序/Outlook365 - 从共享邮箱发送邮件
- kubernetes - 在 GKE 上更改我的 LoadBalancer 的 IP 地址
- jenkins - 使用 Podman Jenkins 容器管道构建 docker 映像时,Buildah 缺少依赖项
- c++ - 我可以重新解释 constexpr 函数的参数吗?
- react-native - React-native 从 0.61.5 升级到 0.63.2:TypeError: Super expression must be null or a function
- android - 设置应用程序调味后,我在运行应用程序时收到此错误“install_failed_conflicting_provider”/
- python - pandas datetime giving wrong output
- python-3.x - Keras LSTM 输入/输出形状
- python-3.x - 在谷歌的应用引擎上构建和部署 reactjs 代码后,asyncToGenerator.js 中的 SyntaxError