Java SpringBoot DTO+;带列表的JPA<;T>;财产

Java SpringBoot DTO+;带列表的JPA<;T>;财产,java,spring-boot,jpa,spring-data-jpa,dto,Java,Spring Boot,Jpa,Spring Data Jpa,Dto,假设我有以下实体(为了简单起见,我跳过了构造函数): 但我想把它改成: PersonDTO findById(int personId); 如果我删除vehicles属性(是一个列表),它将非常有效,但我确实需要这个列表。有什么线索吗?引用: 定义投影的另一种方法是使用值类型DTO(数据传输对象),该DTO保存假定要检索的字段的属性。这些DTO类型的使用方式与投影接口的使用方式完全相同,只是不进行代理,也不应用嵌套投影 您的列表车辆是嵌套投影,因此您的方法不适用。在这种情况下,您需要使用: p

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

但我想把它改成:

PersonDTO findById(int personId);
如果我删除vehicles属性(是一个列表),它将非常有效,但我确实需要这个列表。有什么线索吗?

引用:

定义投影的另一种方法是使用值类型DTO(数据传输对象),该DTO保存假定要检索的字段的属性。这些DTO类型的使用方式与投影接口的使用方式完全相同,只是不进行代理,也不应用嵌套投影

您的
列表车辆
是嵌套投影,因此您的方法不适用。在这种情况下,您需要使用:

public interface PersonProjection {

    int getId();

    String getName();

    List<VehicleProjection> getVehicles();

    interface VehicleProjection {

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

    }

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

引用:

定义投影的另一种方法是使用值类型DTO(数据传输对象),该DTO保存假定要检索的字段的属性。这些DTO类型的使用方式与投影接口的使用方式完全相同,只是不进行代理,也不应用嵌套投影

您的
列表车辆
是嵌套投影,因此您的方法不适用。在这种情况下,您需要使用:

public interface PersonProjection {

    int getId();

    String getName();

    List<VehicleProjection> getVehicles();

    interface VehicleProjection {

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

    }

}

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

DTO的目的是用于数据传输。转换控制器中的表示(您可能还应该使用
@JsonIdentityInfo
来避免嵌套
车辆
实体)。像MapStruct这样的工具在这里非常有用。(注意:也可以使用
LocalDate
作为生日之类的词。)这是否回答了您的问题?tl;博士不允许嵌套属性查看更多详细信息以回答此问题。它们是否有任何错误,并且需要使用的是spring JPA注释。@RobertNiestroj如果我按车辆更改列表,它将正常工作。当你说嵌套属性时,你是指列表吗?你不能像@RobertNiestroj说的那样在DTO中使用嵌套属性。尽管如果您确实需要在数据中使用列表,您必须使用MapperFactory,或者您可以手动调用列表设置器方法,从Person获取列表,并将列表设置为:
personDto.setVehicles(Person.getVehicles)DTO用于数据传输。转换控制器中的表示(您可能还应该使用
@JsonIdentityInfo
来避免嵌套
车辆
实体)。像MapStruct这样的工具在这里非常有用。(注意:也可以使用
LocalDate
作为生日之类的词。)这是否回答了您的问题?tl;博士不允许嵌套属性查看更多详细信息以回答此问题。它们是否有任何错误,并且需要使用的是spring JPA注释。@RobertNiestroj如果我按车辆更改列表,它将正常工作。当你说嵌套属性时,你是指列表吗?你不能像@RobertNiestroj说的那样在DTO中使用嵌套属性。尽管如果您确实需要在数据中使用列表,您必须使用MapperFactory,或者您可以手动调用列表设置器方法,从Person获取列表,并将列表设置为:
personDto.setVehicles(Person.getVehicles)
PersonDTO findById(int personId);
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);