首页 > 解决方案 > 使用单个 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。谢谢!

标签: javahibernatepojodto

解决方案


我已经与 DTO 合作了一段时间,这里有一些我可以分享的东西:

  • 尝试根据您的需要构建 DTO 层次结构(抽象类和/或接口)
  • 即使您BookDTO的“只是”扩展了一个超类(AbstractIdDescriptionDTO例如),它也总是更具可读性(IMO),并且维护起来也不那么乏味,而且您不能将一个对象误解为另一个对象
  • 我从不使用new DTO语法,而是实现了一个自动转换器

推荐阅读