繁体   English   中英

转换Spring Data JPA Page内容的类型

[英]Convert type of Spring Data JPA Page content

我正在使用Spring Data JPA,我有一个使用JPASpecificationExecutor<Contact>PagingAndSortingRepository<Contact, Long> JPASpecificationExecutor<Contact> 我将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 ,我不知道如何将该CollectionPage的内容中。 有没有办法做到这一点? 或者是否有另一种方法来调用Page<Contact>实例本身的转换?

事实证明, 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;
}

可能会出现Page变换效率较低的情况,就像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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM