2015-10-07 17 views
16

Utilizzo Spring Data JPA e ho un PagingAndSortingRepository<Contact, Long> che utilizza uno JPASpecificationExecutor<Contact>. Trasmetto un'istanza Specification e una al metodo .findAll() di questo repository per ottenere uno Page<Contact>.Conversione del tipo di dati Spring JPA Contenuto della pagina

Tuttavia, la mia entità Contact ha molti campi e mappature aggiuntivi che non ho bisogno sul mio front-end. Quindi, ho un ContactDto che contiene solo i campi necessari e ho un metodo che può convertire da Contact a ContactDto.

private ContactDto convertToContactDto(Contact contact) { 
    //do the conversion 
} 

Come posso fare per utilizzare questo metodo di conversione per convertire il Page<Contact> ad un Page<ContactDto>?

Posso ottenere il contenuto di Page<Contact> ed eseguire la conversione in questo modo.

final Page<Contact> contactPage = pagingAndSortingContactRepository 
     .findAll(ContactSpecification.findByFirstNmLike(firstNm), pageable); 

final Collection<ContactDto> contactDtos = contactPage.getContent() 
    .stream() 
    .map(this::convertToContactDto) 
    .collect(Collectors.toList()); 

Ma poi mi sono lasciato con un Collection invece di una Page, e non so come ottenere che Collection nel contenuto del Page. C'è un modo per fare questo? O c'è un altro modo per chiamare la conversione sull'istanza Page<Contact> stessa?

risposta

30

Si scopre che Page ha il proprio metodo .map(), al quale è possibile passare un riferimento al metodo per eseguire la conversione.

Ecco come ho finito per fare la conversione.

final Page<ContactDto> contactDtoPage = contactPage.map(this::convertToContactDto); 

Il metodo convertToContactDto crea semplicemente e restituisce un'istanza della classe che sto cercando di convertire in:

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; 
} 
+0

Questo ha fatto il trucco. È molto più facile che creare una nuova istanza di pagina e copiare gli oggetti. –

+0

@Andrew puoi includere qualche esempio del codice da convertToContactDto per favore? –

Problemi correlati