【问题标题】:JPA @JoinTable with extra join conditions带有额外连接条件的 JPA @JoinTable
【发布时间】:2015-03-12 19:14:32
【问题描述】:

我花了几个小时四处寻找,没有找到与我的情况类似的东西。

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

合同(任何商业实体) -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,但我可以每个角色拥有多个合同;
  • 在 DB 端创建一个视图(这个确实有效:)

谢谢!

【问题讨论】:

    标签: java hibernate jpa jointable


    【解决方案1】:

    你必须使用:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的想法。我也有这个问题,但是从这样的角度来看:我如何调用所有当事方,以便拥有与 role='signer' 对应的合同列表?我可以使用查询来执行此操作吗? JPA 查询是什么?
      • 相关:@JoinFormula
      • @WhereJoinTable(clause = "ROLE ='SIGNER'")
      猜你喜欢
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 2014-03-15
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多