具有额外连接条件的JPA @JoinTable
我花了几个小时在周围搜索,没有发现任何类似于我的情况。
让我们假设遵循多对多数据模型:
合同(任何商业实体) - 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 contracts;
没事儿。
但我正在寻找的是如何映射具有特定角色的合同?
@OneToMany @??? ( "ROLE = 'SIGNER' ") private List signedContracts;
从技术上讲,我正在寻找一种在JOIN语句中添加额外条件的方法。
到目前为止,在类似主题中发现了以
- 将连接表映射为单独的实体,并使用自定义查询按角色执行过滤;
- Hibernate有@JoinFormula注释,但无法在@JoinTable中应用它;
- Hibernate也有@Where注释,但它为Contract表添加条件而不是连接表;
- 使用@MapKeyColumn并返回Map而不是List,但每个角色可以有多个合约;
- 在DB端创建一个视图(这个确实有效:)
谢谢!
您可以使用@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 contracts;
你必须使用:
@WhereJoinTable(clause = "ROLE ='SIGNER'")