Spring Boot 如何在实体中包含关系表中的列,而不会在列表中出现“缺少列”错误?

svmlkihl  于 2023-06-05  发布在  Spring
关注(0)|答案(1)|浏览(114)

假设我有3个相关的表:“公司”、“工人”和“技能”。一个公司可以有很多工人,工人可以有很多技能。公司与员工的关系是通过company_worker_id完成的,并且skills表具有一个worker_id列,该列存储与worker表中的worker_id列相同的ID。
很好,现在我想在前端创建一个列表,显示一个工人列表和他们的技能,当一个公司被选中。
因此,首先我创建一个公共接口,它扩展到skills实体并连接所有三个表

public interface SkillRepository extends JpaRepository<Skills, UUID> {
@Query(nativeQuery = true, value = """
                    select
                        UUID() id,
                        s.*,
                        w.name worker_name
                    from
                        worker w
                        INNER JOIN skills s ON w.id = s.worker_id
                    where
                       w.id = s.worker_id
                       AND w.company_id = :companyId
        """)
List<skills> getSkillsAndWorkers(UUID companyId);
}

好极了
现在棘手的部分来了。为了在前端输出数据时显示worker_name,我需要将其作为一列添加到skills实体文件中,如下所示:

@Entity 
@Table(name = "skills") 
@public class Skills {
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @Column(name = "id")
    private UUID id;
    
    @Column(name = "worker_id")
    private UUID workerId;
    
    @Column(name = "worker_name")
    private String workerName;
}

这当然可以,但是skills实体用于系统中的其他列表,所以当我将worker_name添加到该文件中时,其他列表将崩溃,我将得到一个警告,即“worker_name”列丢失,这很明显,因为它没有用于任何其他列表,而不是使用“getSkillsAndWorkers”查询的列表。
我知道我可以只做一个内部连接,并将worker_name添加到系统中的每个其他查询中,但是必须有不同的方法来处理这个问题。
所以我的问题是如何将worker实体中的worker_name列包含在skills实体中,而不会弄乱系统中使用skills实体但没有worker数据的其他列表?

hjzp0vay

hjzp0vay1#

您需要的是返回技能DTO的查询。在这里查看如何操作https://thorben-janssen.com/spring-data-jpa-dto-native-queries/
另一个选项是返回Worker实体,每个Worker都有一个Skill列表。

相关问题