Итак, я создаю API для Spring, который хранит инопланетян и их семейные отношения. До сих пор я добился создания связи ManyToOne - OneToMany между родителем и потомком, то есть я сохраняю имя и идентификатор родителя, а когда я делаю запрос на получение, я получаю идентификатор, имя и потомки этого идентификатора. Тем не менее, я хочу вывести полностью вложенное представление всех инопланетян в базе данных как единую сущность.
Итак, моя БД выглядит так:
insert into (id, name, planet, type, parent_id) ALIEN values (1,'William','Earth','Alpha', null);
insert into (id, name, planet, type, parent_id) ALIEN values (2,'Henry', 'Earth', 'Alpha',1);
insert into (id, name, planet, type, parent_id) ALIEN values (3,'Matt', 'Mars','Beta', 2);
insert into (id, name, planet, type, parent_id) ALIEN values (4,'Alisa', 'Mars', 'Gamma',2);
И что я получил так далеко:
Контроллер
@GetMapping("/all")
public Stream<AlienDto> getAll() {
return repo.findAll().stream().map(mapToAlienDto);
}
private Function<Alien, AlienDto> mapToAlienDto = p -> AlienDto.builder()
.id(p.getId())
.name(p.getName())
.planet(p.getPlanet())
.type(p.getType())
.children(p.getChildren())
.build()
;
AlienDto
@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonIgnoreProperties({"hibernate_lazy_initializer", "handler"})
public class AlienDto {
private Long id;
private String name;
private String type;
private String planet;
private Alien parent;
private Set<Alien> children;
}
Чужой класс
@Entity
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties({"hibernate_lazy_initializer", "handler"})
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Alien {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
@Setter
@EqualsAndHashCode.Include
private Long id;
@Getter
@Setter
private String name;
@Getter
@Setter
private String type;
@Getter
@Setter
private String planet;
@ManyToOne(fetch=FetchType.LAZY)
@Getter
@Setter
private Alien parent;
@OneToMany(mappedBy="parent", fetch=FetchType.LAZY)
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Setter
private Set<Alien> children;
// @JsonIgnore
public Set<Alien> getChildren() {
return children;
}
@JsonIgnore
public Alien getParent() {
return parent;
}
Что я получил
[
{
"id": 1,
"name": "William",
"type": "Alpha",
"planet": "Earth",
"children": [
{
"id": 2,
"name": "Henry",
"type": "Alpha",
"planet": "Earth"
}
]
},
{
"id": 2,
"name": "Henry",
"type": "Alpha",
"planet": "Earth",
"children": [
{
"id": 3,
"name": "Matt",
"type": "Beta",
"planet": "Mars"
},
{
"id": 4,
"name": "Alisa",
"type": "Gamma",
"planet": "Mars"
}
]
},
{......
Что я хочу:
{
"id": 1,
"name": "William",
"type": "Alpha",
"planet": "Earth",
"children": [
{
"id": 2,
"name": "Henry",
"type": "Alpha",
"planet": "Earth",
"children": [
id,
name,......
]
}
Спасибо!