转换 Spring 数据 JPA 页面内容的类型
Convert type of Spring Data JPA Page content
我正在使用 Spring Data JPA,并且我有一个使用 JPASpecificationExecutor<Contact>
的 PagingAndSortingRepository<Contact, Long>
。我将 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
放入 [=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;
}
我正在使用 Spring Data JPA,并且我有一个使用 JPASpecificationExecutor<Contact>
的 PagingAndSortingRepository<Contact, Long>
。我将 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
放入 [=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;
}