如何向 Hibernate @ManyToMany 关系添加 where 子句?
How to add a where clause to a Hibernate @ManyToMany relationship?
给定两个实体:
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
注释下方添加以下内容,但均失败,并出现列的 "invalid identifier" 异常:
@Where(clause = "status <> 'D'")
@WhereJoinTable(clause = "purchaseProduct.status <> 'D'")
还尝试在实体级别使用添加 @Where(clause = "status <> 'D'")
,但这似乎不会影响关系集合的内容 - 正如 this question 支持的那样。
请尝试以下代码:
@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
。但是根据您上面的评论,我们需要告诉 Hibernate 如何映射此列。
参考:
给定两个实体:
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
注释下方添加以下内容,但均失败,并出现列的 "invalid identifier" 异常:
@Where(clause = "status <> 'D'")
@WhereJoinTable(clause = "purchaseProduct.status <> 'D'")
还尝试在实体级别使用添加 @Where(clause = "status <> 'D'")
,但这似乎不会影响关系集合的内容 - 正如 this question 支持的那样。
请尝试以下代码:
@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
。但是根据您上面的评论,我们需要告诉 Hibernate 如何映射此列。
参考: