例如,我有两个实体: UserJobOffer 我想在一个页面上显示这两个实体的列。 我发现DTO可以做到这一点,而我的问题是: 是否可以以不使用DTO的不同方式来做到这一点?

User.java

@Entity @Table(name = "user") public class User {  @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id_user") private Integer id;  @Column(name = "name",nullable = false) private String name;  @Column(name = "last_name",nullable = false) private String lastName;  @Column(name = "email",nullable = false, unique = true) private String email;  @Column(name = "password",nullable = false) private String password;  @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<JobOffer> jobOffers; 

JobOffer.java

@Entity @Table(name = "job_offer") public class JobOffer {  @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "idjob_offer") private Integer id;  @Column(name = "title", nullable = false) private String title;  @Column(name = "location", nullable = false) private String location;  @Column(name = "description" , nullable = false) private String description;  @Column(name = "contact", nullable = false) private String contact;  @Column(name = "category", nullable = false) private String category;  @Column(name = "company_name", nullable = false) private String companyName;  @Column(name = "contract_type", nullable = false) private String contractType;  @Column(name = "working_time", nullable = false) private String workingTime;  @Column(name = "monthly_pay", nullable = false) private String monthlyPay;  @Column(name = "position_level", nullable = false) private String positionLevel;  @ManyToOne @JoinColumn(name = "id_user") private User user; 

JobOfferDTO.java

public class JobOfferDTO {  private String title; private String location; private String category; private String email; //getters setters ... 

JobOfferRepository.java

@Repository public interface JobOfferRepository extends JpaRepository<JobOffer, Integer> {  @Query("Select new com.biuropracy.demo.DTO.JobOfferDTO(j.title, j.location, j.category, u.email)  from JobOffer j join  j.user u") public List<JobOfferDTO> getJobOfferDTO(); } 

一切正常,但是是否有其他更好或更简单的方法可以将这些列显示在一页上?

===============>>#1 票数:0

首先,您需要考虑您在存储库中正在执行的任务。

  • 您在一个查询中检索有关两个实体的信息。
  • 您正在通过加入来匹配Jobs与Users。
  • 您正在将在select子句中要求的结果转换为“ JobOfferDTO”。

现在,让我们看看是否有另一种无需使用DTO即可完成这些任务的方法。

  • 首先,您必须从您的API中而不是从实体中公开DTO, 在这里您可以找到有关为什么要这样做的一些答案。 因此,换句话说,至少在控制器级别,您将获得DTO。
  • 现在让我们看看是否可以在DAO级别避免DTO。 如果您保持实体不变,那么您将需要进行两个单独的查询,然后在服务级别由您自己以编程方式将工作机会与相关用户进行匹配。 这恐怕是在join已经在查询中为你做。

    唯一的另一种选择是重构您的实体并创建一个可以同时映射用户和工作机会表的实体。 在这里看看一个例子。 但是再一次,您需要在公开之前将单个实体转换为其相对的DTO。

  • 最后,关于第三个任务,将实体转换为DTO,如果您决定从查询中检索实体,则需要创建方法以转换为相对的DTO。 例如,用于将User转换为UserDTO并将Job转换为JobDTO的映射器,或者如果您使用辅助工作表创建用户实体,则将有一个将userJobs转换为userJobsDTO的映射器。 因此,让您的查询也照顾映射,这对您来说也是有利的。

我希望这回答了你的问题。

  ask by Piotror translate from so

本文未有回复,本站智能推荐: