一尘不染

JPA @JoinTable具有额外的加入条件

hibernate

我花了几个小时进行搜索,没有发现与我的案子相似的内容。

让我们假设以下多对多数据模型:

合同(任何业务实体)
-contract_id
-其他领域

当事人(另一个业务实体)
-party_id
-其他领域

Contract_Party(前两个之间的关系 
带有其他角色指示器,例如所有者,签名者,卖方等)
-contract_id
-party_id
-角色

现在,假设我要映射与合同方(单向)有关的 所有 合同。可以使用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表而不是join表添加了条件;
  • 使用@MapKeyColumn并返回Map而不是List,但是每个角色可以有多个合同;
  • 在数据库端创建一个视图(这个确实可行:)

谢谢!


阅读 1472

收藏
2020-06-20

共1个答案

一尘不染

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