【问题标题】:Join Two Tables without foreign keys in Spring Boot with similar Ids在具有相似 ID 的 Spring Boot 中加入两个没有外键的表
【发布时间】:2020-01-24 12:32:51
【问题描述】:

这里有两张桌子;两者都有 ID 作为主键。我想知道如何根据它们的 ID 在没有外键的情况下加入这些表。服务实现应该是什么,存储库中应该有什么? @QueryJOINS怎么写?

@Entity
@Table(name = "procedures")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class Procedure implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ProcedureId")
    private int id;

    @Column(name = "ProcedureName")
    private String name;
    @Column(name = "ProcedureCode")
    private String code;

    @Column(name = "ProcedureDesc")
    private String desc;
//  getters and setters
}
@Entity
@Table(name = "cliniciandescriptor")
public class CPTClinicianDescriptor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "ConceptId")
    private int conceptId;

    @Column(name = "CPTCode")
    private String cptCode;

    @Column(name = "ClinicianDescriptorId")
    private int clinicianDescriptorId;


    @Column(name = "ClinicianDescriptor")
    private String clinicianDescriptor;
//  getters and setters
}

【问题讨论】:

  • 你为什么不想使用外键?另外:ProcedureCodeCPTCode 对我来说看起来像是自然主键,所以你应该考虑不使用代理 id

标签: spring spring-boot spring-data-jpa


【解决方案1】:

您可以像在 SQL 中一样使用 JOIN 语法

例如

select p from Procedure p join CPTClinicianDescriptor c on c.id = p.id;

在此处阅读有关该主题的更多信息: https://72.services/how-to-join-two-entities-without-mapped-relationship/

【讨论】:

  • 当我写这个时我们正在打印p 它只打印程序的列表它没有与 CPTClinicianDescriptor 结合
【解决方案2】:

考虑到它是一对一的关系,你可以使用这样的东西。

@Entity
@Table(name = "procedures")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class Procedure implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ProcedureId")
    private int id;

    @Column(name = "ProcedureName")
    private String name;
    @Column(name = "ProcedureCode")
    private String code;

    @OneToOne(optional = false)
    @JoinColumn(name = "id", updatable = false, insertable = false)
    private CPTClinicianDescriptor  descriptor;

    @Column(name = "ProcedureDesc")
    private String desc;
//  getters and setters
}

【讨论】:

  • 嗨,我得到了结果,谢谢,如果我也想从其他表中获取,我可以再添加一个 @JoinColumn 对吗?
  • @RaviChandraT 是的,您可以添加多个。
  • 谢谢,我怀疑我是否有一个映射表(CPTProcedures),它的外键为 Procedures 和 ClinicianDesc,如上所述,没有在 Procedures 中添加 @JoinColumn,我可以得到列表带有 ClinicianDesc 的程序,我想为程序控制器而不是 CPTProcedures 编写列表
猜你喜欢
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2014-11-16
  • 2023-04-08
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多