如何在spring-data-rest中将Page<ObjectEntity>映射为Page<ObjectDTO>

84
当我使用 PagingAndSortingRepository.findAll(Pageable) 访问数据库时,我会得到 Page<ObjectEntity>。然而,我希望向客户端公开 DTO 而不是实体。我可以通过将实体注入其构造函数来创建 DTO,但如何将 Page 对象中的实体映射为 DTO 呢?根据 Spring 文档,Page 提供只读操作。
另外,由于我们不支持 Java 8,因此不能使用 Page.map。如何手动创建包含映射对象的新 Page?

4
我不确定,但我猜您可以在不使用 lambda 表达式的情况下使用 Page.map。只需传递一个 Converter<? super T, ? extends S> 的实例即可。 - Ali Dehghani
14个回答

2

我曾经使用Lambda和ModelMapper一起工作。

    Page<ObjectEntity> pageEntity = objectRepository.findAll(pageable);
    Page<ObjectDto> pageDto = pageEntity.map(objectEntity -> modelMapper.map(objectEntity, ObjectDto.class));

0
在最后,您不会将页面返回给用户,而是返回一个ObjectDTO列表,其中包含页眉的详细信息,这将是我的解决方案。

ObjectService

public Page<ObjectEntity> findAll (Pageable pageable){
  //logic goes here.
  Page<ObjectEntity> page = objectRepository.findAll(pageable);
  return page;
} 

ObjectResource / rest(暴露的端点)

@GetMapping
public ResponseEntity<List<ObjectDTO>> findAll (Pageable pageable){
  Page<ObjectEntity> page = objectServiceService.findAll(pageable);

  HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "your-endpoint-here");

  return new ResponseEntity<>(objectMapper.toDto(page.getContent()), headers, HttpStatus.OK);
}

使用这个的原因是为了避免在ObjectEntity和DTO中重复页面细节。需要注意的是,一个页面包含以下内容:
  • 页码
  • 每页大小
  • 元素数量
  • 内容
内容是返回的对象列表,也是唯一需要映射到DTO的东西。

0
尝试这段代码 服务
Pageable pageable = PageRequest.of(page - 1, size);
Page<ContentResDTO> resDTOPage = contentRepository.findAllBy(contentID, userId, pageable);

代码库

@Query("SELECT new com.example.demo.dto.content.ContentResDTO(t, COUNT(DISTINCT c.cmtID), COUNT(DISTINCT r.rctId)) " +
            "FROM TMnTrContent t LEFT JOIN TMnTrComment c ON t.cntID = c.content.cntID LEFT JOIN TMnTrReact r ON t.cntID = r.content.cntID " +
            " WHERE (:cntId IS NULL OR (:cntId IS NOT NULL AND t.cntID = :cntId)) AND " +
            " (:userId IS NULL OR (:userId IS NOT NULL AND t.user.userId = :userId)) " +
            " GROUP BY t.cntID")
    Page<ContentResDTO> findAllBy(@Param("cntId") Long cntId,
                                  @Param("userId") Long userId,
                                  Pageable pageable);

DTO

@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class ContentResDTO {
    private long id;
    private long userId;
    private String type;
    private String description;
    private int version;
    private Date createdDate;
    private Date modifyDate;
    private int commentCount;
    private int reactCount;

    public ContentResDTO(TMnTrContent content, long commentCount, long reactCount) {
        this.id = content.getCntID();
        this.userId = content.getUser().getUserId();
        this.type = content.getCntType();
        this.description = content.getCntDescription();
        this.version = content.getVersion();
        this.createdDate = content.getCreateDate();
        this.modifyDate = content.getModifyDate();
        this.commentCount = (int) commentCount;
        this.reactCount = (int) reactCount;
    }

}

0
这里有一个选项,如果你还需要从原始数据中获取totalElements和totalPages。
@Component
@RequiredArgsConstructor
public class CreditIssuedMapper {

public static CreditIssuedDto toCreditIssuedDto(CreditIssued creditIssued){

    CreditIssuedDto c = new CreditIssuedDto();

    c.setId(creditIssued.getId());

    c.setClientId(creditIssued.getClientData().getId());
    c.setClientName(creditIssued.getClientData().getClientName());
    c.setClientSurname(creditIssued.getClientData().getClientSurname());
    c.setClientMiddlename(creditIssued.getClientData().getClientMiddlename());

    c.setManagerId(creditIssued.getManagerData().getId());
    c.setManagerName(creditIssued.getManagerData().getManagerName());
    c.setManagerSurname(creditIssued.getManagerData().getManagerSurname());
    c.setManagerMiddlename(creditIssued.getManagerData().getManagerMiddlename());

    c.setCreditIssuedBody(creditIssued.getCreditBody());
    c.setCreditIssuedLeft(creditIssued.getCreditLeft());
    c.setCreditIssuedFine(creditIssued.getCreditFine());
    c.setCreditIssuedMonthlyPayment(creditIssued.getCreditMonthlyPayment());
    c.setCreditIssuedDate(creditIssued.getCreditIssuedDate());
    c.setCreditIssuedNextPayment(creditIssued.getCreditNextPayment());
    c.setCreditIssuedExpDate(creditIssued.getCreditExpDate());

    c.setCreditOfferId(creditIssued.getCreditOfferId().getId());
    c.setCreditOfferName(creditIssued.getCreditOfferId().getCreditName());
    c.setCreditOfferInterest(creditIssued.getCreditOfferId().getCreditInterest());
    c.setCreditOfferFine(creditIssued.getCreditOfferId().getCreditFine());
    c.setCreditOfferCurrency(creditIssued.getCreditOfferId().getCurrencyData().getCurrencyName());

    return c;

}

public Page<CreditIssuedDto> creditIssuedDto (Page<CreditIssued> creditIssued){

    List<CreditIssuedDto> creditIssuedDto = creditIssued
            .stream()
            .map(CreditIssuedMapper::toCreditIssuedDto)
            .collect(Collectors.toList());

    long totalElements = creditIssued.getTotalElements();
    int totalPages = creditIssued.getTotalPages();

    return new PageImpl<>(creditIssuedDto, PageRequest.of(creditIssued.getNumber(), creditIssued.getSize()), totalElements);
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接