Spring Data:何时使用投影接口和 DTO 投影?

Man*_*dan 5 jpa spring-data spring-data-jpa

我有这种情况:

它即将Spring Data与一组特定的字段一起工作@Entity

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

  1. DTO projections
  2. Projection interfaces

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

因此:

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

基于类的预测 (DTO)部分中的注意事项如下:

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

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

Ron*_*ony 5

DTO方法

  • 简单直接

骗局

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

  • 不能应用嵌套投影。

预测

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

  • 可以应用嵌套投影

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

骗局

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

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

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


gil*_*ore 4

我认为 DTO 是处理来自实体的一小组数据的第一个可能的解决方案。如今,许多操作也可以通过投影进行,但您需要注意性能。如果您看到 Janssen 的帖子Entities or DTOs \xe2\x80\x93 When should you use whichprojection?您会注意到,对于读取操作,DTO 的性能比预测更好。

\n\n

如果您没有性能问题,投影会更加优雅。

\n

  • Janssen 帖子的给定链接比较了实体与 DTO 的使用。但问题是要求对 DTO 与投影接口的使用进行比较! (2认同)