首页 > 解决方案 > 如何修改 REST API 的 Spring 存储库搜索的页面类型结果?

问题描述

我有一个 HotelRepository,它有一个命名方法,它返回一个默认Page<Hotel>项作为结果而不是列表。

我想将页面中的内容类型更改HotelHotelDto,因为 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(我认为返回页面会提高搜索请求的性能)。

那么我应该怎么做才能保持页面优势但仍然具有自定义输出的能力呢?

标签: javaspringpagination

解决方案


你几乎做到了:)

除非我跳过某些内容,否则您唯一需要更改的是传递给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 来说足够的方式:

  1. 第一个参数是包含HotelListItemDemo新页面将具有的内容(类型)的列表。由于这只是将hotels内容映射到另一种类型,因此元素的数量将完全相同。
  2. 第二个参数是页面请求,它为 PageImpl 提供有关页面大小、页面索引(如果您请求的话,可能还有顺序)的信息。
  3. 最后一个参数是追加查询中所有可用页面时所拥有的元素总数(方法中返回的值hotels.getTotalElements())。这样,PageImpl 还可以计算hasNext()我在评论中提到的内容。

希望这对您有所帮助。


推荐阅读