Можно ли выгрузить сущность с частично проинициализированным списком связанных сущностей (oneToMany)?

Приложение на Spring Boot. Имеются сущности с отношением oneToMany:

@Entity
public class House {
    
    @Id
    Integer id;

    @OneToMany(mappedBy = "house")
    List<Citizen> citizens;
}
@Entity
public class Citizen {
    
    @Id
    Integer id;

    String name;

    @ManyToOne
    @JoinColumn(name = "house_id")
    House house;

    @OneToMany(mappedBy = "citizen")
    List<Order> orders;
}
@Entity
public class Order {
    
    @Id
    Integer id;

    @ManyToOne
    @JoinColumn(name = "citizen_id")
    Citizen citizen;

    int price;
}

Некоторые аннотации опущены, не суть. Я хочу выгрузить список сущностей House из базы данных. Причём я хочу сделать так, чтобы у каждой сущности в списке citizens были бы проинициализированы жители, у которых есть определённое имя, а у этих жителей в свою очередь был бы проинициализирован список заказов.

Ну то есть, если представить полученный из базы данных список объектов House в виде JSON, то он должен выглядеть вот так:

[
    {
        id: 100000,
        citizens: [
            {не проинициализировано},
            {не проинициализировано},
            {id: 100168, name: "Petya", orders: [{price: 1012}, {price: 224}, {price: 209}]},
            {не проинициализировано},
            {не проинициализировано},
            {не проинициализировано}
        ]
    },
    {
        id: 100001,
        citizens: [
            {id: 100009, name: "Petya", orders: [{price: 13}]},
            {не проинициализировано},
            {id: 100035, name: "Petya", orders: [{price: 117}, {price: 35}]},
            {не проинициализировано}
        ]
    }
]

Для доступа к базе данных (PostgreSQL) я использую свою реализацию JpaRepository:

@Transactional(readOnly = true)
public interface HouseDao extends JpaRepository<House, Integer> {
}

Как мне теперь следует составить запрос, чтобы добиться желаемого результата? Будет ли работать вот такая конструкция так, как я ожидаю:

@Query("SELECT h FROM House h JOIN h.citizens AS citizen JOIN citizen.orders WHERE cizizen.name=:name")
List<House> getAllWithCitizensWithName(String name);

Если нет, то как я могу составить нужный мне запрос?


Ответы (0 шт):