假设我有以下实体,(为简单起见,我跳过了构造函数):
/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);
如果删除车辆属性(是列表),则效果很好,但是我确实需要此列表。有任何线索吗?
答案 0 :(得分:0)
定义投影的另一种方法是使用值类型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);
不幸的是,基于接口的方法的性能稍差,因为如参考文档所述,发生了代理。