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

Java 如何修改RESTAPI的Spring存储库搜索的页面类型结果?,java,spring,pagination,Java,Spring,Pagination,我有一个HotelRepository,它有一个命名方法,返回一个默认的页面项作为结果,而不是列表 我想将页面中的内容类型Hotel更改为HotelDto,因为DTO有我想显示的自定义参数。我已经有一个建造师将酒店转换为HotelDto 我的尝试: Page<Hotel> hotels = dao.findAll(pageRequest); return new PageImpl<>( hotels.getContent().stream(

我有一个HotelRepository,它有一个命名方法,返回一个默认的
页面
项作为结果,而不是列表

我想将页面中的内容类型
Hotel
更改为
HotelDto
,因为DTO有我想显示的自定义参数。我已经有一个建造师将酒店转换为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 hotels=dao.findAll(pageRequest);
返回新的PageImpl(
hotels.getContent().stream()
.map(hotel->newhotellistitemdto(hotel,hotel.getSupplier()).collect(Collectors.toList()),
pageRequest,hotels.getContent().size());
问题是它只处理结果的一页。当然,我可以先以列表的形式获取所有结果,然后根据列表创建一个页面,但它失去了
页面
的优势(我认为返回页面会提高搜索请求的性能)

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

您几乎做到了:)

除非我跳过了某些内容,否则您只需要更改传递给
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());
Page hotels=dao.findAll(pageRequest);
返回新的PageImpl(
hotels.getContent().stream()
.map(hotel->newhotellistitemdto(hotel,hotel.getSupplier()).collect(Collectors.toList()),
pageRequest,hotels.getTotalElements());
上面的代码将创建一个与
hotels
页面类似的页面。这就是您的参数如何满足PageImpl的要求:

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

  • 希望这对您有所帮助。

    但是
    Page.getContent()
    是一个单页列表,对吗?新页面如何知道内容是否是最后/第一页(内容不提供页面索引)?是的,
    hotels.getContent()
    提供实际页面中的值列表。但是,
    hotels
    页面
    类型的一个实例,该类型包含有关此页面和其他内容(如页面中的全部元素)的更多信息。如果你想知道更多关于
    页面的属性,你可以顺便检查一下,如果你想知道实际的页面是否是最后一个,你还可以使用
    hotels.hasNext()
    方法返回一个布尔值。我知道
    hotels
    是一个正确的页面,我说的是我使用修改后的
    hotels.getContent
    列表创建的新页面imple。我将编辑答案,为您提供更多详细信息。请给我+1,如果你认为我很清楚,请接受答案。如果没有,请添加另一条评论。