【问题标题】:JPA/HIbernate: Joining 2 Entities Multiple TimesJPA/HIbernate:多次加入 2 个实体
【发布时间】:2011-07-08 23:19:44
【问题描述】:

我有一个无法更改的旧数据库,因为它已连接到第 3 方应用程序。

我正在处理的一个新应用程序查询如下所示:

SELECT COL1, COL2, COL3, CODE1, CODE2, (SELECT CODE_DESC FROM CODETABLE WHERE CODE_TYPE='A' CODE=INCIDENT.CODE1) AS CODE_DESC1, (SELECT CODE_DESC FROM CODETABLE WHERE CODE_TYPE='B' CODE=INCIDENT.CODE2) AS CODE_DESC2 FROM INCIDENT WHERE...

我试图弄清楚如何将该查询转换为一组 Hibernate 实体,但我是 Hibernate 新手。我有 3 个问题:

  1. 如何以一对一的关系多次将一个实体加入另一个实体? (子查询)
  2. 如何使用具有固定值 (CODE_TYPE='A') 的参数以一对一的关系将一个实体连接到另一个实体?
  3. 是否可以使用注释来执行上述任一操作(因为我喜欢这些)?

这是我迄今为止尝试过但没有奏效的方法:

对象 1:

@Entity
@Table (name="Incident")
public class Incident {
    private String col1;
    private String col2;
    private String col3;
    private String code1;
    private String code2;
    private Code code_desc1;
    //private String code_desc2;
    /**
     * @param code_desc1 the code_desc1 to set
     */
    public void setCode_desc1(Code code_desc1) {
        this.code_desc1 = code_desc1;
    }
    /**
     * @return the code_desc1
     */
    @OneToOne
    @JoinTable(name="Codes",
            joinColumns=@JoinColumn(name="code1", referencedColumnName="CODE"),
            inverseJoinColumns=@JoinColumn(name="CODE_TYPE", referencedColumnName="'A'")
    )
    public Code getCode_desc1() {
        return code_desc1;
    }
// Rest of Getters & Setters...
}

对象 2:

@Entity
@Table (name="CODETABLE")
public class Codes {
    @Column(name="CODE_DESC") 
    private String codeDesc;
    @Column(name="CODE_TYPE")
    private String codeType;
    @Column(name="CODE")
    private String code;
// Getters & Setters
}

基本上,当我运行程序时,它会抱怨“A”不是 Codes 实体中的列名。 感谢您的帮助!

【问题讨论】:

    标签: java hibernate jpa join one-to-one


    【解决方案1】:

    您应该创建一个视图作为您描述的查询,并定义一个到该视图的实体映射。

    如果您仍然需要在“事件”处映射的“代码”实体,请查看以下示例:

    @Entity
    @Table(name="incident")
    public class Incident {
        @Id
        @Column(name="id")
        private Integer id;
    
        @OneToOne
        @JoinColumn(name="code1")
        private CodeA typeACode;
        @OneToOne
        @JoinColumn(name="code2")
        private CodeB typeBCode;
    
        public Incident() {}
    
        public CodeA getTypeACode() { return this.typeACode; }
        public CodeB getTypeBCode() { return this.typeBCode; }
    }
    

    “CodeA”是映射到视图的实体,符合CODE_TYPE='A'。 “CodeB”与上述配方相同。

    【讨论】:

    • 我一直在研究这个问题,我同意。归结为将所有内容放在一个视图中并将一个实体与之绑定。我真的想要一种更 Hibernatey 的方式来使用 2 个对象而不是所有对象都是 1 个对象,但我能想出的唯一方法是为每个子查询使用不同的 Code 对象。我缩短了这个例子的查询。原始查询中有 23 个子查询,每个子查询都有自己的代码类型。我有 1 个用户有数百起导致程序崩溃的事件。因此,除非我能找到另一个解决方案,否则目前只有 1 个视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2022-01-05
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2015-08-14
    相关资源
    最近更新 更多