如何从数据库中获取列表字段作为DTO? Spring Boot - querydsl?

问题描述 投票:0回答:1

我要写我的表,我将给出主 DTO (WorkerDTO) 和其他 DTO,我想将它们用作主 DTO 的字段。

我想获取包含CarDTO列表的WorkerDTO列表。我怎样才能做到这一点?我想一举完成。我不想一次又一次地去数据库。

我会失去我的小头脑。

@Table(name = "person")
public class Person {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "last_name")
    private String lastName;

    @OneToMany(mappedBy = "personId", cascade = CascadeType.ALL)
    private Set<Car> cars = new LinkedHashSet<>();
}
@Table(name = "car")
public class Car {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id")
    private Person personId;

    @JoinColumn(name = "motor_id")
    private Motor motorId;

    @Column(name = "model")
    private String model;

    @Column(name = "color")
    private String color;
}
@Table(name = "motor")
public class Motor {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "type")
    private String type;
}
public class WorkerDTO {
     private string name;
     private List<CarDTO> cars; 
     
}
public class CarDTO{
     private MotorDTO motor;
     private String model;
}
public class MotorDTO{
     private String type;
}

我使用 QueryDsl 的 Projections.list(...) 方法左加入汽车列表。

我尝试了@Query(“选择新的WorkerDTO(...”)

我想我会找到像第二个问题一样的问题。

java spring hibernate spring-data-jpa querydsl
1个回答
0
投票

@OneToMany 的默认 FetchType 是 FetchType.LAZY。如果你想让工人拥有装满的汽车,你可以将 FetchType 更改为 EAGER,但不建议这样做。

您可以创建自己的可以返回 List 的方法:

@Query("SELECT DISTINCT person FROM Person person " +
        "JOIN FETCH person.cars cars")

或在现有存储库方法上使用 EntityGraph,例如查找全部:

@EntityGraph(attributePaths = {"cars"})
© www.soinside.com 2019 - 2024. All rights reserved.