2011-07-08 76 views
2

我有一個遺留數據庫,因爲它連接到第三方應用程序,所以無法更改。JPA/HIbernate:多次加入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個問題:

  1. 如何將一個實體以一對一的關係多次加入另一個實體? (子查詢)
  2. 如何將一個實體與另一個實體以一對一的關係使用a(缺少更好的單詞)參數具有固定值(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", 
      [email protected](name="code1", referencedColumnName="CODE"), 
      [email protected](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」不是代碼實體中的列名。 感謝您的幫助!

回答

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」與上面的配方相同。

+0

我一直在解決這個問題,我同意。歸結起來,將所有東西都放在一個視圖中,並將一個實體綁在一起。我真的想要一個更加Hibernatey的方式來處理這兩個對象,而不是一切都是一個對象,但唯一的辦法是每個子查詢都會包含一個不同的Code對象。我縮短了這個例子的查詢。在原始查詢中有23個子查詢,每個子查詢都有自己的代碼類型。我有1個用戶有數百個導致程序崩潰的事件。因此,除非我能找到另一種解決方案,否則現在是1視圖。 – kelleystar