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

时间:2011-07-08 23:19:45

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

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

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

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. 是否可以使用注释执行上述任一操作(因为我喜欢这些)?
  4. 这是我迄今为止尝试过的不起作用的内容:

    对象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 :(得分: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”与上述配方相同。