And*_*ose 27 java spring hibernate spring-data-jpa
我正在使用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
}
Run Code Online (Sandbox Code Playgroud)
我将如何使用此转换方法将其转换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());
Run Code Online (Sandbox Code Playgroud)
但后来我留下了一个Collection而不是一个Page,我不知道如何把它Collection变成了内容Page.有没有办法做到这一点?或者是否有另一种方法来调用Page<Contact>实例本身的转换?
And*_*ose 60
事实证明,Page它有自己的.map()方法,您可以传递方法引用来进行转换.
以下是我最终进行转换的方式.
final Page<ContactDto> contactDtoPage = contactPage.map(this::convertToContactDto);
Run Code Online (Sandbox Code Playgroud)
该 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;
}
Run Code Online (Sandbox Code Playgroud)
可能出现的情况是,Page.map(..)与手中的整个集合相比,迭代执行页面转换的效率可能较低(很可能会这样做)。
在这种情况下,我们可以使用 SpringPageExecutionUtils来完成用转换后的内容重建页面的混乱工作。
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15688 次 |
| 最近记录: |