转换类型 弹簧数据 JPA 页面内容

2022-09-01 04:55:01

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

但是,我的实体有很多额外的字段和映射,我在前端不需要这些字段和映射。因此,我有一个仅包含必要字段的方法,并且我有一个可以从转换为.ContactContactDtoContactContactDto

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());

但是,我留下了 a 而不是 a ,我不知道如何将其纳入 .有没有办法做到这一点?或者是否有其他方法可以在实例本身上调用转换?CollectionPageCollectionPagePage<Contact>


答案 1

事实证明,它有自己的方法,您可以向其传递方法引用以进行转换。Page.map()

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

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

该方法只是创建并返回我尝试转换为的类的实例:convertToContactDto

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;
}

答案 2

与手头的整个集合相比,以迭代方式执行 Page 转换的效率可能较低(很可能如此)。Page.map(..)

在这种情况下,我们可以使用Spring's来完成使用转换后的内容重建页面的混乱工作。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;
}

推荐