Spring Data JPAを使用していますが、_PagingAndSortingRepository<Contact, Long>
_を使用する_JPASpecificationExecutor<Contact>
_があります。 _Page<Contact>
_を取得するには、Specification
およびPageable
インスタンスをこのリポジトリの.findAll()
メソッドに渡します。
ただし、私の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>
_インスタンス自体で変換を呼び出す別の方法がありますか?
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.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;
}