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 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.
Podobne pytania
Powiązane pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
@JsonIdentityInfo
, aby uniknąć zagnieżdżania encjivehicles
). Narzędzie takie jak MapStruct jest tutaj bardzo pomocne. (Uwaga: użyj takżeLocalDate
na coś takiego jak urodziny.)personDto.setVehicles(person.getVehicles);