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);