首页 > 解决方案 > Spring Data:何时使用 Projection 接口和 DTO 投影?

问题描述

我有这种情况:

它即将使用Spring Data并使用一组特定的字段@Entity

这两个建议对我来说完全有效:

  1. DTO projections
  2. Projection interfaces

更重要的是,spring-data-examples两者同时出现(我知道是出于示例目的):

因此:

  1. 什么时候强制使用一种,为什么?
  2. 是否存在一种性能成本?

基于类的投影 (DTO)部分中的注释说明如下:

定义投影的另一种方法是使用值类型 DTO(数据传输对象),它包含应该检索的字段的属性。这些 DTO 类型的使用方式与使用投影接口的方式完全相同,只是不会发生代理并且不能应用嵌套投影。

似乎优点是:except that no proxying happens no nested projections can be applied

标签: jpaspring-dataspring-data-jpa

解决方案


DTO 方法

  • 简单而直接

骗局

  • 这将导致更多代码,因为您必须使用构造函数和 getter/setter 创建 DTO 类(除非您使用 Project Lombok 来避免 DTO 的样板代码)。

  • 不能应用嵌套投影。

预测

  • 更少的代码,因为它只使用接口。

  • 可以应用嵌套投影

  • 动态投影允许您编写一种通用存储库方法,以根据客户的需要返回实体对象中属性的不同子集。

骗局

  • Spring 在运行时生成代理
  • 查询可以将整个实体对象从数据库返回到 Spring 层,尽管修剪版本(通过投影)从 Spring 层返回到客户端。我不确定这个特定的缺点,希望有人在必要时编辑这个答案。

如果您需要嵌套或动态投影,您可能需要 Projection 方法而不是 DTO 方法。

有关详细信息,请参阅Spring 官方文档


推荐阅读