java - 使用单个 DTO 对象进行投影
问题描述
我在必须为每个实体对象使用单个 DTO 对象或 DTO 对象时遇到了麻烦。例如,我有 3 个类:Book、Author 和 Publisher。
图书.java
@Entity
@Table(name = "tbl_book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "description")
private String description;
other different fields...
}
作者.java
@Entity
@Table(name = "tbl_author")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "description")
private String description;
other different fields...
}
Publisher.java
@Entity
@Table(name = "tbl_publisher")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "description")
private String description;
other different fields...
}
和MyDTO.java
public class MyDTO {
private Long id;
private String description;
constructor id, description...
getters and setters...
}
我只想使用 EntityManager 选择特定字段(id 和描述):
em.createQuery("SELECT NEW MyDTO(id,description) FROM Book");
但我的问题是我应该对所有投影使用单个 DTO 对象(即 MyDTO)吗?就像是:
em.createQuery("SELECT NEW MyDTO(id,description) FROM Author");
em.createQuery("SELECT NEW MyDTO(id,description) FROM Publisher");
关于使用 DTO 进行投影的教程只是说使用 DTO 进行读取和使用实体进行写入,但它们并没有说明是否有单个对象 DTO。请您提供一个示例,为什么单个 DTO 或为什么每个实体都使用 DTO。谢谢!
解决方案
我已经与 DTO 合作了一段时间,这里有一些我可以分享的东西:
- 尝试根据您的需要构建 DTO 层次结构(抽象类和/或接口)
- 即使您
BookDTO
的“只是”扩展了一个超类(AbstractIdDescriptionDTO
例如),它也总是更具可读性(IMO),并且维护起来也不那么乏味,而且您不能将一个对象误解为另一个对象 - 我从不使用
new DTO
语法,而是实现了一个自动转换器
推荐阅读
- python - 带条件的循环不结束 vs 带 if 语句的循环
- angular - Angular Firebase 后台推送通知
- ruby - 如何在 Ruby 的 attr_reader 和 attr_writer 中使用变量@@?
- rust - 我如何在我的系统中访问世界?(锈+军团)
- c++ - 是否可以通过 clang-format 格式化概念
- python - raise CompileError(msg) ImportError: Building module msanomalydetector._anomaly_kernel_cython failed
- php - 修改 wordpress 小部件
- dart - 在 Dart 中使用固定参数初始化超级构造函数的最佳方法?
- html - 如何在ul Angular中过滤组件
- python - 用具有该值的列中的值替换列中的值