web-dev-qa-db-ja.com

追加の結合条件を使用したJPA @ JoinTable

私は数時間探し回っていましたが、私の場合に似たものは見つかりませんでした。

次の多対多のデー​​タモデルを想定しましょう。

契約(任意の事業体)
-contract_id 
-その他のフィールド
 
パーティ(別の事業体)
-party_id 
-その他のフィールド
 
 Contract_Party(最初の2つの
と追加の役割インジケーター(所有者、署名者、販売者など)との関係)
-contract_id 
-party_id 
-役割

ここで、マッピングしたいとしますallパーティに関連する契約(一方向)。これは、Partyエンティティクラスで次のアノテーションを使用して実行できます。

@OneToMany
@JoinTable(
  name="Contract_Party", 
  joinColumns = {@JoinColumn(name="party_id", referencedColumnName="party_id")},
  inverseJoinColumns = {@JoinColumn(name="contract_id", referencedColumnName="contract_id")}
}
private List<Contract> contracts;

それは結構です。

しかし、私が探しているのは、契約を特定の役割でマップする方法です。

@OneToMany
@??? ( "ROLE = 'SIGNER' ")
private List<Contract> signedContracts;

技術的には、JOINステートメントに追加条件を追加する方法を探しています。

これまでのところ、同様のトピックで次のアイデアが見つかりました。

  • 結合テーブルを個別のエンティティとしてマップし、カスタムクエリを使用してロールによるフィルタリングを実行します。
  • Hibernateには@JoinFormulaアノテーションがありますが、@ JoinTable内に適用する方法はありません。
  • Hibernateにも@Whereアノテーションがありますが、結合テーブルではなくコントラクトテーブルの条件が追加されます。
  • @MapKeyColumnを使用して、Listの代わりにMapを返しますが、1つのロールごとに複数のコントラクトを持つことができます。
  • dB側でビューを作成します(これは実際に機能します:)

ありがとう!

9
Vitaljok

@WhereJoinTableアノテーションを使用できます。関連付けテーブルに適用されます

@OneToMany
@JoinTable(
  name="Contract_Party", 
  joinColumns = {@JoinColumn(name="party_id",referencedColumnName="party_id")},
  inverseJoinColumns = {@JoinColumn(name="contract_id", referencedColumnName="contract_id")}
}
@WhereJoinTable  ( "ROLE = 'SIGNER' ")
private List<Contract> contracts;
19
jjbravo

使用する必要があります:

@WhereJoinTable(clause = "ROLE ='SIGNER'")
3
Thiago Araújo