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

12

我有这种情况:

两个建议对我来说都是完全有效的:

  1. DTO 投影
  2. 投影接口

更进一步,在 spring-data-examples 中,两者同时出现(我知道这是为了示例目的):

因此:
  1. 何时强制使用其中之一以及原因?
  2. 存在一个性能成本比另一个更高吗?

注意基于类的投影(DTO)部分中提到:

定义投影的另一种方式是使用值类型DTO(数据传输对象),该DTO包含应检索的字段的属性。这些DTO类型可以像使用投影接口一样使用,只是没有代理发生,也不能应用嵌套投影。

看起来优点是:只是没有代理发生 也不能应用嵌套投影

2个回答

6

DTO方法

优点

  • 简单直接

缺点

  • 会导致更多代码,因为你需要创建DTO类以及构造函数和getter/setter方法(除非你利用Project Lombok来避免DTO的样板代码)。

  • 无法应用嵌套投影。

投影方法

优点

  • 使用接口,所以代码量较少。

  • 可以应用嵌套投影。

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

缺点

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

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

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


4
我认为DTO是处理实体数据的一种解决方案。如今,许多操作也可以使用投影完成,但需要注意性能。如果您查看Janssen在Entities or DTOs – When should you use which projection?中的帖子,您会发现DTO在读取操作方面比投影具有更好的性能。
如果您不关心性能问题,则投影更加优雅。

1
提供的链接指向Janssen的帖子,比较了实体与DTO的使用。但问题要求比较DTO与接口在投影中的使用! - sebin vincent
@sebinvincent 如果您看到此消息,请详细说明DTO投影和投影。我无法理解DTO、投影和DTO投影之间的区别。简而言之,我只理解DTO是一个类,而投影通常是一个接口,但这仍然不能帮助我正确区分这三个概念。您的意见将对我有很大帮助! - humbleCodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接