【问题标题】:How does map from Page from Spring data works?来自 Spring 数据的 Page 的映射如何工作?
【发布时间】:2020-06-27 03:52:36
【问题描述】:

正如标题所说,来自 org.springframework.data.domain.Page 的 map 是如何工作的?

根据文档,它建议您将转换器作为地图参数,然后您将获得包含转换后内容的新地图。按照这个解释,我写了如下代码。

Page<T> results = getPagedResults();
return results.map(x -> {
  x.setElement("some constant");
  return x;
});

但是,上述操作并没有按预期工作。我得到了所有其他值都完好无损的页面,比如计数等,但内容是一个空列表!我实际上不得不这样写代码。

Page<T> results = getPagedResults();
return new Page<T>() {
  @Override
  public int getTotalPages() {
    return results.getTotalPages();
  }

  ...

  @Override
  public List<T> getContent() {
    List<T> contents = result.getContent();
    for (T content : contents) {
      content.setElement("some constant");
    }
    return contents;
  }

  ...
};

第二个选择是冗长的,似乎做了多余的工作。我原以为第一段代码也能做到这一点,但事实并非如此。

我是否阅读了错误的文档?如果不应该使用Page的地图功能,你会在哪里使用它,我使用它的方式?

【问题讨论】:

  • 如果页面内容为空content:[] 那么.map(...) 将不起作用
  • 内容不是,我自己查了。

标签: java spring pagination


【解决方案1】:

像下面这样放置一个真正的转换器怎么样:

        Page<T> results = getPagedResults();
        Page<T> convertedResults = results.map(new Converter<T, T>() {
            @Override
            public T convert(T page) {
                Page page2 = new Page();
                page2.setElement('some constant');
                //set other fields

                return page2;
            }
        });

【讨论】:

  • 我确实尝试过,但没有奏效。此外,Converter 类似于Functional 接口,因此您可以将其重写为 lambda 而不会丢失功能。
  • 我明白了,也许它期望创建新对象。查看我的新解决方案
  • 对延迟回复表示歉意。我不确定更新后的响应是否会起作用,因为即使那样,您也会有一个新页面,并且您会丢失正在转换的页面的属性。此外,您仍然必须获取页面的内容并查看它们以重置它们。这不是我要寻找的一次性答案。
  • 我喜欢这个想法,我必须通过一些转换为分页列表添加附加过滤器。此过滤器非常复杂,并且使用不直接连接到数据库字段的附加计算字段。有人可以指出页面转换的任何工作代码示例吗?
【解决方案2】:

您可以像我们一样使用地图:

results.map(mapper::convert)

convert 是映射器将数据库实体转换为 DTO 或任何其他对象的方法。

【讨论】:

    猜你喜欢
    • 2016-12-26
    • 2020-05-29
    • 2018-01-22
    • 2019-01-05
    • 1970-01-01
    • 2020-01-26
    • 2023-03-26
    • 2020-11-01
    • 2020-12-13
    相关资源
    最近更新 更多