Spłaszczenie encji z kolekcją do prostej formy

0

Stosuję spring data.
Nakreślę stukturę.

Parent {
	String name;
	List<Child> childs
}

Child {
	String name;
{

Mając dwie encje Parent i Child tak jak poniżej chciałbym spłaszczyć dane do formy:

ParentDTO{
	String name;
	String childName;
}

A właściwie do listy List<ParentDTO>, która w przypadku dwóch childów będzie posiadała dwa obiekty i zduplikowane dane z parenta, przykład:

ParentDTO{
	name = parent.name;
	childName = child1.name
},
ParentDTO{
	name = parent.name;
	childName = child2.name
},

Próbowałem osiągnąć wynik stosując projekcje ale bez powodzenia. Czy ktoś mógłby mnie nakierować? :)

0

Chcesz listę List<Parent> zamienić na listę List<ParentDTO>? A gdzie dokładnie jest problem?

parents.stream()
    .flatMap(parent -> parent.getChildren().stream().map(child -> new ParentDTO(parent.getName(), child.getName()))
    .collect(Collectors.toList());

(pisane z palca może brakować jakichś nawiasów :P

0

Tak jak @Aleksander32 napisał chciałbym to zrobić na poziomie JPA. Uprościłem problem do najprostszej postaci

0

To zrób odpowiednie query do bazy? o_O select parent.name, child.name from ... ;)

1

https://medium.com/swlh/spring-data-jpa-projection-support-for-native-queries-a13cd88ec166

A wgl polecam obczaić jdbi3 zamiast spring data.
Bo jak ci kiedyś przyjdzie łączyć różne bazy danych na raz w jednym projekcie to zobaczysz jaki to syf.

0

Wiem, że mogę to zrobić odpowiednim query, raczej rozbiłem się na słabej znajomości spring data, na którym chciałem to oprzeć. Okazuje się, że mogę to zrobić mapowanie w query zaraz po słowie select

    @Query("SELECT new com.organization.dto.FlattenDto(args..) WHERE ...)

@Schadoow dzięki za sugestię, zajrzę tam :). A co do pytania, to próbowałem to zrobić projekcją ale w projekcji nie da się chyba tak spłaszczyć zagnieżdżonych kolekcji. Chyba, że się mylę?

1 użytkowników online, w tym zalogowanych: 0, gości: 1