【问题标题】:How to add a where clause to a Hibernate @ManyToMany relationship?如何将 where 子句添加到 Hibernate @ManyToMany 关系?
【发布时间】:2017-12-06 11:30:49
【问题描述】:

给定两个实体:

  • PurchaseProductGroup
  • PurchaseProduct,它有一个status 列,可以是'A'(活动)或'D'(已删除)

以及PurchaseProductGroup中定义的多对多关系:

/** The purchase products linked to this group. */
@ManyToMany
@JoinTable(name = "purchaseprodgrp_purchaseprod",
           joinColumns = @JoinColumn(name = "ppg_id"),
           inverseJoinColumns = @JoinColumn(name = "ppr_id"))
private List<PurchaseProduct> purchaseProducts;

我该如何限制这一点,以便排除状态为 'D' 的 purchaseProducts?

我尝试过的事情

已尝试在 @ManyToMany 注释下方添加以下内容,但均因列的“无效标识符”异常而失败:

  1. @Where(clause = "status &lt;&gt; 'D'")
  2. @WhereJoinTable(clause = "purchaseProduct.status &lt;&gt; 'D'")

还尝试在实体级别使用添加​​ @Where(clause = "status &lt;&gt; 'D'"),但这似乎不会影响关系集合的内容 - 由 this question 支持。

【问题讨论】:

  • 我不确定 Hibernate 是否可以实现您的确切想法。如果支持,我们可以在 status 列本身上添加检查约束,但这会将所有 'D' 值完全从表中排除。您最终可能会使用的方法只是在查询中添加 WHERE 子句。顺便说一句,这根本不是最糟糕的事情,尤其是如果您正确调整查询。
  • 希望在代码中处理实体本身时始终排除已删除的记录(而不是使用显式查询)。对列本身施加约束的第一个建议似乎是一个不错的建议,请您进一步解释一下如何做到这一点?
  • 不,约束方法对您不起作用,因为它会阻止具​​有'D'所有 记录进入数据库。我可能会在这里使用WHERE 子句。无论如何,如何提取实际数据的逻辑属于 IMO 的查询方面。
  • 我认为约束方法是将@Where(clause = "status &lt;&gt; 'D'") 放在PurchaseProduct 实体的顶部。你是说如果它试图通过调用setStatus('D') 来更新持​​久的PurchaseProduct,这实际上会阻止删除工作?
  • 请编辑您的问题并告诉我们您将@Where@WhereJoinTable 注释放在哪里。

标签: oracle hibernate many-to-many jointable hibernate-filters


【解决方案1】:

请尝试以下代码:

@ManyToMany
@JoinTable(name = "purchaseprodgrp_purchaseprod",
       joinColumns = @JoinColumn(name = "ppg_id"),
       inverseJoinColumns = @JoinColumn(name = "ppr_id"))
@Where(clause = "ppr_status <> 'D'")
private List<PurchaseProduct> purchaseProducts;

这可能与您之前尝试过的类似,但要使其正常工作的关键点是ppr_status 是实际的列名。因此PurchaseProduct 实体应具有以下内容:

@Column(name="ppr_status")
public String getStatus() {
    return status;
}

如果您已将字段命名为 ppr_status,则可能不需要 @Column。但是根据您上面的 cmets,我们需要告诉 Hibernate 如何映射此列。

参考:Hibernate annotations. @Where vs @WhereJoinTable

【讨论】:

  • 太棒了,这很好,感谢您的帮助!现在已经提出了类似的问题here
  • @SteveChambers 谢谢,并为我早期的 cmets 道歉,因为我不是 Hibernate API 的所有部分的专家。
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
相关资源
最近更新 更多