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

时间:2018-05-04 13:39:31

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

我遇到这种情况:

它即将与Spring Data合作并使用@Entity

的特定字段集合

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

  1. DTO projections
  2. Projection interfaces
  3. 更多的是,spring-data-examples同时出现(我知道是出于示例目的):

    因此:

    1. 什么时候必须使用一个而不是为什么?
    2. 一个人的成绩是否存在?
    3. Class-based Projections (DTOs)部分中的

      注意说明如下:

        

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

      似乎有以下优点:except that no proxying happens no nested projections can be applied

2 个答案:

答案 0 :(得分:2)

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

如果您没有表现问题,预测会更优雅。

答案 1 :(得分:1)

DTO方法

Pro

  • 简单而向前

Con

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

  • 不能应用任何嵌套投影。

投影

Pro

  • 由于仅使用接口而减少了代码。

  • 可以应用嵌套投影

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

Con

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

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

有关详细信息,请参见official Spring doc