Powiedzmy, że mam następującą jednostkę (pomijam konstruktora dla uproszczenia):

public class Person {
    int id;
    String name;
    String lastName;
    Date birthday;
    List<Vehicles> vehicles;
}

I chcę utworzyć DTO, aby uzyskać tylko to, czego potrzebuję z bazy danych:

public class PersonDTO {
    int id;
    String name;
    List<Vehicles> vehicles;
}

Moje repozytorium Crud wygląda następująco:

Person findById(int personId);

Ale chcę to zmienić na:

PersonDTO findById(int personId);

Działa idealnie, jeśli usunę właściwość pojazdy (jest to lista), ale potrzebuję tej listy. Jakaś wskazówka?

1
jre 16 grudzień 2019, 20:53
Celem DTO jest transfer danych. Przekształć reprezentację w kontrolerze (i prawdopodobnie powinieneś również użyć @JsonIdentityInfo, aby uniknąć zagnieżdżania encji vehicles). Narzędzie takie jak MapStruct jest tutaj bardzo pomocne. (Uwaga: użyj także LocalDate na coś takiego jak urodziny.)
 – 
chrylis -cautiouslyoptimistic-
16 grudzień 2019, 21:49
Czy to odpowiada na twoje pytanie? Projekcja Spring Data DTO tl;dr; zagnieżdżone właściwości są niedozwolone
 – 
Robert Niestroj
16 grudzień 2019, 21:53
Chcesz poznać więcej szczegółów, aby odpowiedzieć na to pytanie. Czy wystąpiły jakieś błędy z tym i czy są używane adnotacje wiosny JPA.
 – 
Supun Perera
16 grudzień 2019, 21:59
Jeśli zmienię List według Vehicles, to działa. Mówiąc o zagnieżdżonej właściwości, masz na myśli List<>?
 – 
jre
16 grudzień 2019, 22:39
Nie możesz używać właściwości zagnieżdżonych w DTO, jak powiedział @RobertNiestroj. Chociaż jeśli naprawdę potrzebujesz listy w swoim DTO, będziesz musiał użyć MapperFactory lub możesz ręcznie wywołać metodę ustawiającą List i pobrać listę od osoby i ustawić ją w następujący sposób: personDto.setVehicles(person.getVehicles);
 – 
Rohan Shah
17 grudzień 2019, 11:42

1 odpowiedź

Powołując się na odniesienie Spring Data JPA:

Innym sposobem definiowania prognoz jest użycie obiektów DTO (Data Transfer Objects) typu wartości, które przechowują właściwości pól, które mają zostać pobrane. Te typy DTO mogą być używane dokładnie w taki sam sposób, jak interfejsy projekcji, z wyjątkiem tego, że nie zachodzi proxy i nie można zastosować zagnieżdżonych projekcji.

Twoje List<Vehicles> vehicles jest projekcją zagnieżdżoną, więc Twoje podejście nie ma zastosowania. Musisz skorzystać z interfejsu projekcja oparta w tym przypadku:

public interface PersonProjection {

    int getId();

    String getName();

    List<VehicleProjection> getVehicles();

    interface VehicleProjection {

        // Getters for desired fields of Vehicle as above for Person(Projection)

    }

}

Następnie możesz zmienić metodę repozytorium na

PersonProjection findById(int personId);

Niestety podejście oparte na interfejsie jest nieco mniej wydajne, ponieważ, jak stwierdza dokumentacja referencyjna, zachodzi proxy.

1
Times 28 grudzień 2019, 01:28