wake-up-neo.net

Konvertieren Sie den Inhalt der Spring Data JPA-Seite

Ich verwende Spring Data JPA und habe einen PagingAndSortingRepository<Contact, Long>, der einen JPASpecificationExecutor<Contact> verwendet. Ich übergebe eine Specification- und eine Pageable-Instanz an die .findAll()-Methode dieses Repositorys, um einen Page<Contact> zu erhalten.

Meine Contact-Entität enthält jedoch viele zusätzliche Felder und Zuordnungen, die ich an meinem Frontend nicht benötige. Ich habe also eine ContactDto, die nur die erforderlichen Felder enthält, und ich habe eine Methode, die von Contact in ContactDto konvertieren kann.

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

Wie gehe ich mit dieser Konvertierungsmethode vor, um den Page<Contact> in einen Page<ContactDto> umzuwandeln?

Ich kann den Inhalt des Page<Contact> abrufen und die Konvertierung so durchführen.

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

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

Aber dann bleibt mir eine Collection statt einer Page, und ich weiß nicht, wie ich diese Collection in den Inhalt der Page bekommen kann. Gibt es eine Möglichkeit, dies zu tun? Oder gibt es eine andere Möglichkeit, die Konvertierung in der Page<Contact>-Instanz selbst aufzurufen?

22
Andrew Mairose

Stellt sich heraus, dass Page eine eigene .map()-Methode hat, an die Sie eine Methodenreferenz übergeben können, um die Konvertierung durchzuführen.

So habe ich die Konvertierung gemacht.

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

Die convertToContactDto-Methode erstellt einfach eine Instanz der Klasse, in die ich versuche, 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;
}
44
Andrew Mairose

Es kann der Fall sein, dass eine Seitentransformation weniger effizient ist, um iterativ durchzuführen, als dies Page.map(..) wahrscheinlich ist, als wenn die gesamte Sammlung in der Hand ist.

In diesem Fall können wir Spring's PageExecutionUtils verwenden, um die unordentliche Arbeit beim Rekonstruieren einer Seite mit dem transformierten Inhalt zu erledigen.

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