Преобразование типа содержимого Spring данных 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
}

Как я могу использовать этот метод преобразования для преобразования 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>?

Ответы

Ответ 1

Оказывается, что 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;
}