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