除了使用 dto 之外,还有其他方法可以显示来自两个实体的数据吗
Is there any other way to display data from two entities than using dto
例如,我有两个实体:User 和 JobOffer。我想在一页上显示这两个实体的列。我发现 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();
}
一切正常,但是否有其他可能更好或更简单的方法在一页上显示这些列?
首先,您需要考虑您在存储库中执行的任务。
- 您正在一次查询中检索有关两个实体的信息。
- 您正在通过加入为用户匹配职位。
- 您正在将 select 子句中要求的结果转换为 "JobOfferDTO"。
现在,让我们看看是否有另一种方法可以在不使用 DTO 的情况下完成这些任务。
- 首先,您必须从您的 API 而不是实体中公开 DTO,here 您可以找到一些关于为什么要这样做的答案。所以换句话说,至少在你的控制器级别,你最终会得到一个 DTO。
现在让我们看看是否可以在 DAO 级别避免 DTO。如果您保持实体现在的状态,那么您将需要进行两个单独的查询,然后在服务级别由您自己以编程方式将工作机会与相关用户匹配。这是 join
已经在查询中为您做的事情。
唯一的其他选择是重构您的实体并创建一个实体来映射用户和工作机会 table。看一下 here 的例子。但是话又说回来,您需要在公开之前将该单个实体转换为其相关的 DTO。
最后关于第三个任务,将实体转换为 DTO,如果您决定从查询中检索实体,则需要创建方法以转换为相关的 DTO。用于将 User 转换为 UserDTO 并将 Job 转换为 JobDTO 的映射器,或者如果您创建具有次要 table 工作机会的用户实体,您将拥有一个用于 userJobs 到 userJobsDTO 的映射器。因此,让您的查询也负责映射,对您来说也是有益的。
我希望这能回答你的问题。
例如,我有两个实体:User 和 JobOffer。我想在一页上显示这两个实体的列。我发现 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();
}
一切正常,但是否有其他可能更好或更简单的方法在一页上显示这些列?
首先,您需要考虑您在存储库中执行的任务。
- 您正在一次查询中检索有关两个实体的信息。
- 您正在通过加入为用户匹配职位。
- 您正在将 select 子句中要求的结果转换为 "JobOfferDTO"。
现在,让我们看看是否有另一种方法可以在不使用 DTO 的情况下完成这些任务。
- 首先,您必须从您的 API 而不是实体中公开 DTO,here 您可以找到一些关于为什么要这样做的答案。所以换句话说,至少在你的控制器级别,你最终会得到一个 DTO。
现在让我们看看是否可以在 DAO 级别避免 DTO。如果您保持实体现在的状态,那么您将需要进行两个单独的查询,然后在服务级别由您自己以编程方式将工作机会与相关用户匹配。这是
join
已经在查询中为您做的事情。唯一的其他选择是重构您的实体并创建一个实体来映射用户和工作机会 table。看一下 here 的例子。但是话又说回来,您需要在公开之前将该单个实体转换为其相关的 DTO。
最后关于第三个任务,将实体转换为 DTO,如果您决定从查询中检索实体,则需要创建方法以转换为相关的 DTO。用于将 User 转换为 UserDTO 并将 Job 转换为 JobDTO 的映射器,或者如果您创建具有次要 table 工作机会的用户实体,您将拥有一个用于 userJobs 到 userJobsDTO 的映射器。因此,让您的查询也负责映射,对您来说也是有益的。
我希望这能回答你的问题。