我正在使用Spring Data JPA,我有PagingAndSortingRepository<Contact, Long>
使用JPASpecificationExecutor<Contact>
。我将Specification
和Pageable
实例传递给此存储库的.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
放入Page
的内容中}。有没有办法做到这一点?或者是否有另一种方法可以在Page<Contact>
实例本身上调用转换?
答案 0 :(得分:48)
事实证明Page
有自己的.map()
方法,您可以将方法引用传递给该方法进行转换。
以下是我最终进行转换的方式。
final Page<ContactDto> contactDtoPage = contactPage.map(this::convertToContactDto);
convertToContactDto
方法只是创建并返回我尝试转换为的类I的实例:
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;
}
答案 1 :(得分:0)
可能会出现这样的情况:与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;
}