除了使用dto之外,还有其他方法可以显示来自两个实体的数据

问题描述 投票:1回答:1

例如,我有两个实体: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();
}

一切正常,但是还有其他更好或更简单的方法可以在一页上显示此列吗?

hibernate jpa spring-data-jpa dto
1个回答
0
投票

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

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

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

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

    唯一的替代方法是重构您的实体并创建一个可以同时映射用户和工作机会表的实体。以here为例。但是再一次,您需要在公开之前将单个实体转换为其相对的DTO。

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

我希望这能回答您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.