具有额外连接条件的JPA @JoinTable

时间:2015-01-14 14:53:21

标签: java hibernate jpa jointable

我花了几个小时四处搜寻,并没有发现任何类似于我的情况。

让我们假设遵循多对多数据模型:

Contract (any business entity)
- contract_id
- other fields

Party (another business entity)
- party_id
- other fields

Contract_Party (relations between first two 
with additional role indicator, e.g. owner, signer, seller, etc)
- contract_id
- party_id
- role

现在让我们假设我要映射与派对相关的所有合同(单向)。可以使用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注释,但它为Contract表添加条件而不是连接表;
  • 使用@MapKeyColumn并返回Map而不是List,但每个角色我可以有多个合约;
  • 在DB端创建一个视图(这个确实有效:)

谢谢!

2 个答案:

答案 0 :(得分:19)

您可以使用@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;

答案 1 :(得分:3)

您必须使用:

@WhereJoinTable(clause = "ROLE ='SIGNER'")