【问题标题】:Spring Data: when use Projection interfaces and DTO projections?Spring Data:何时使用 Projection 接口和 DTO 投影?
【发布时间】:2018-10-15 00:33:39
【问题描述】:

我有这种情况:

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

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

  1. DTO projections
  2. Projection interfaces

更重要的是,spring-data-examples 同时出现(我知道是为了示例):

因此:

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

注意Class-based Projections (DTOs) 部分说明如下:

定义投影的另一种方法是使用值类型 DTO(数据 传输对象),其中包含以下字段的属性 应该被找回。这些 DTO 类型可以准确地用于 使用相同的方式投影接口,除了没有代理 发生并且不能应用嵌套投影。

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

【问题讨论】:

    标签: jpa spring-data spring-data-jpa


    【解决方案1】:

    我认为 DTO 是第一个使用来自实体的一小组数据的可能解决方案。今天,许多操作也可以通过预测进行,但您需要注意性能。如果您看到此 Janssen 的帖子 Entities or DTOs – When should you use which projection?,您会注意到 DTO 的性能优于读取操作的预测。

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

    【讨论】:

    • Janssen 帖子的给定链接比较了实体与 DTO 的使用情况。但问题是要求比较 DTO 与接口的使用情况进行预测!
    【解决方案2】:

    DTO 方法

    专业版

    • 简单直接

    骗局

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

    • 不能应用嵌套投影。

    预测

    专业版

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

    • 可以应用嵌套投影

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

    骗局

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

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

    详情请参阅official Spring doc

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多