jpa - Spring Data:何时使用 Projection 接口和 DTO 投影?
问题描述
我有这种情况:
它即将使用Spring Data
并使用一组特定的字段@Entity
这两个建议对我来说完全有效:
DTO projections
Projection interfaces
更重要的是,spring-data-examples
两者同时出现(我知道是出于示例目的):
因此:
- 什么时候强制使用一种,为什么?
- 是否存在一种性能成本?
基于类的投影 (DTO)部分中的注释说明如下:
定义投影的另一种方法是使用值类型 DTO(数据传输对象),它包含应该检索的字段的属性。这些 DTO 类型的使用方式与使用投影接口的方式完全相同,只是不会发生代理并且不能应用嵌套投影。
似乎优点是:except that no proxying happens
和 no nested projections can be applied
解决方案
DTO 方法
临
- 简单而直接
骗局
这将导致更多代码,因为您必须使用构造函数和 getter/setter 创建 DTO 类(除非您使用 Project Lombok 来避免 DTO 的样板代码)。
不能应用嵌套投影。
预测
临
更少的代码,因为它只使用接口。
可以应用嵌套投影
动态投影允许您编写一种通用存储库方法,以根据客户的需要返回实体对象中属性的不同子集。
骗局
- Spring 在运行时生成代理
- 查询可以将整个实体对象从数据库返回到 Spring 层,尽管修剪版本(通过投影)从 Spring 层返回到客户端。我不确定这个特定的缺点,希望有人在必要时编辑这个答案。
如果您需要嵌套或动态投影,您可能需要 Projection 方法而不是 DTO 方法。
有关详细信息,请参阅Spring 官方文档。
推荐阅读
- python - 如何根据第一个索引 pandas df 中的字符串删除行
- python - 插入数据时 ElasticSearch Mapper 解析异常
- angularjs - 如何将具有角度js中动态生成的行的表数据从视图传递到角度控制器
- javascript - 流类型:如何键入动态类工厂
- firebase - 想要从 web 中的 firebase 实时数据库中过滤数据
- java - 插入数据库需要太多时间
- react-native - 如何导航到未显示在 BottomTabNavigator 或 DrawerNavigator 中的屏幕
- exception-handling - ARM中的异常是什么?
- java - 用java3d创建空心圆柱体
- php - php文件中android volley POST请求的安全性