首页 文章

JPA / HIbernate:多次加入2个实体

提问于
浏览
2

我有一个遗留数据库,由于它连接到第三方应用程序,因此无法更改 .

我正在为新应用程序使用的查询之一如下所示:

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个问题:

  • 如何多次以一对一的关系将实体加入另一个实体? (子查询)

  • 如何使用一个具有固定值(CODE_TYPE = 'A')的缺少更好的单词的一对一关系将实体加入另一个实体?

  • 是否可以使用注释执行上述任一操作(因为我喜欢这些)?

以下是我迄今为止尝试过的不起作用的内容:

对象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”不是代码实体中的列名 . 谢谢你的帮助!

1 回答

  • 0

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

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

    @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"与上述配方相同 .

相关问题