如何修改Spring存储库搜索REST API的页面类型结果?

Lun*_*ape 5 java spring pagination

我有一个 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());
Run Code Online (Sandbox Code Playgroud)

问题是它只操作结果的一页。当然,我可以先把所有的结果作为一个列表,然后根据列表创建一个页面,但是这样就失去了Page(我认为返回页面会提高搜索请求的性能)的优势。

那么我应该怎么做才能保持页面优势,但仍然可以自定义输出?

Ari*_*han 11

你几乎做到了:)

除非我跳过某些内容,否则您唯一需要更改的是传递给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());
Run Code Online (Sandbox Code Playgroud)

上面的代码将创建一个类似于hotels页面的页面。这就是您的参数足以用于 PageImpl 的方式:

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

希望这对你有帮助。