web-dev-qa-db-ja.com

Spring Data JPAページコンテンツのタイプを変換する

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が残っており、そのCollectionPageの内容に入れる方法がわかりません。これを行う方法はありますか?または、_Page<Contact>_インスタンス自体で変換を呼び出す別の方法がありますか?

26
Andrew Mairose

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;
}
55
Andrew Mairose

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;
}
0
spaceman spiff