2011-07-08 13 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エンティティのセットにそのクエリを変換する方法を把握しようとしています、私は休止状態の初心者です。

  1. エンティティを他のエンティティに1対1の関係で複数回参加させるにはどうすればよいですか? (サブクエリ)
  2. 固定値(CODE_TYPE = 'A')のパラメータを使用して、より良い単語がないために、1対1の関係でエンティティを別のエンティティに結合するにはどうすればよいですか?
  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"がCodesエンティティの列名ではないことについて文句を言う。 助けてくれてありがとう!

答えて

0

説明したクエリとしてビューを作成し、このビューにエンティティマッピングを定義する必要があります。

「CODEA」
@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; } 
} 

CODE_TYPE = 'Aに準拠ビューへのエンティティのマッピング、である:あなたはまだ、チェック次の例の「事件」にマッピングされた「コード」の実体が必要な場合は

'。 "CodeB"は上記レシピと同じです。

+0

私はこの問題にもっと取り組んでおり、私は同意します。すべてのことを視点に入れ、それに一つのエンティティを結びつけることに至りました。私は実際には、2つのオブジェクトで1つのオブジェクトではなく、これを行うより多くの休止状態の方法を望んでいましたが、私が考えることができる唯一の方法は、すべてのサブクエリごとに異なるコードオブジェクトを伴います。私はこの例のクエリを短縮しました。元のクエリにはそれぞれ独自のコードタイプを持つ23のサブクエリがあります。私には、プログラムをクラッシュさせる何百ものインシデントを持つ1人のユーザーがいます。私は別の解決策を見つけることができない限り、今のところ1ビュー。 – kelleystar

関連する問題