转换 Spring 数据 JPA 页面内容的类型

Convert type of Spring Data JPA Page content

我正在使用 Spring Data JPA,并且我有一个使用 JPASpecificationExecutor<Contact>PagingAndSortingRepository<Contact, Long>。我将 SpecificationPageable 实例传递给此存储库的 .findAll() 方法以获取 Page<Contact>.

但是,我的 Contact 实体有很多我在前端不需要的额外字段和映射。所以,我有一个只包含必要字段的 ContactDto,并且我有一个可以从 Contact 转换为 ContactDto 的方法。

private ContactDto convertToContactDto(Contact contact) {
    //do the conversion
}

我将如何使用这种转换方法将 Page<Contact> 转换为 Page<ContactDto>

我可以获取 Page<Contact> 的内容并像这样进行转换。

final Page<Contact> contactPage = pagingAndSortingContactRepository
        .findAll(ContactSpecification.findByFirstNmLike(firstNm), pageable);

final Collection<ContactDto> contactDtos = contactPage.getContent()
    .stream()
    .map(this::convertToContactDto)
    .collect(Collectors.toList());

但是我只剩下 Collection 而不是 Page,而且我不知道如何将 Collection 放入 [=27= 的内容中].有没有办法做到这一点?还是有另一种方法可以在 Page<Contact> 实例本身上调用转换?

原来 Page 有自己的 .map() 方法,您可以将方法引用传递给该方法来进行转换。

这是我最终进行转换的方式。

final Page<ContactDto> contactDtoPage = contactPage.map(this::convertToContactDto);

convertToContactDto 方法简单地创建 returns 我要转换为 class 的一个实例:

private ContactDto convertToContactDto(final Contact contact) {
    final ContactDto contactDto = new ContactDto();
    //get values from contact entity and set them in contactDto
    //e.g. contactDto.setContactId(contact.getContactId());
    return contactDto;
}

与手头的整个集合相比,Page.map(..) 可能会这样做,因此迭代执行页面转换的效率可能较低。

在这种情况下,我们可以使用 Spring 的 PageExecutionUtils 来完成使用转换后的内容重建页面的繁琐工作。

public Page<TypeB> getPageAsTypeB(Pageable pageable) {
    Page<TypeA> pageA = pagingAndSortingContactRepository(pageable);
    Function<List<TypeA>, List<TypeB>> collectionTransform;

    Page<TypeB> pageB = PageableExecutionUtils.getPage(
        collectionTransform.apply(pageA.getContent()),
        pageable,
        pageA::getTotalElements);
    return pageB;
}