具有List <T>属性的SpringBoot DTO + JPA

时间:2019-12-16 17:53:08

标签: java spring-boot jpa spring-data-jpa dto

假设我有以下实体,(为简单起见,我跳过了构造函数):

/auth

我想创建一个DTO,以便仅从数据库中获取我需要的东西:

public class Person {
    int id;
    String name;
    String lastName;
    Date birthday;
    List<Vehicles> vehicles;
}

我的Crud存储库如下所示:

public class PersonDTO {
    int id;
    String name;
    List<Vehicles> vehicles;
}

但是我想将其更改为:

Person findById(int personId);

如果删除车辆属性(是列表),则效果很好,但是我确实需要此列表。有任何线索吗?

1 个答案:

答案 0 :(得分:0)

引用Spring Data JPA reference

  

定义投影的另一种方法是使用值类型DTO(数据传输对象),这些DTO包含应该被检索的字段的属性。除了不进行代理并且不能应用嵌套的投影之外,这些DTO类型的使用方式可以与投影接口的使用方式完全相同。

您的List<Vehicles> vehicles是嵌套的投影,因此您的方法不适用。在这种情况下,您需要使用interface-based projection

public interface PersonProjection {

    int getId();

    String getName();

    List<VehicleProjection> getVehicles();

    interface VehicleProjection {

        // Getters for desired fields of Vehicle as above for Person(Projection)

    }

}

然后您可以将存储库方法更改为

PersonProjection findById(int personId);

不幸的是,基于接口的方法的性能稍差,因为如参考文档所述,发生了代理。