Oracle 如何将where子句添加到Hibernate@ManyToMany关系中?
鉴于两个实体:Oracle 如何将where子句添加到Hibernate@ManyToMany关系中?,oracle,hibernate,many-to-many,jointable,hibernate-filters,Oracle,Hibernate,Many To Many,Jointable,Hibernate Filters,鉴于两个实体: PurchaseProductGroup PurchaseProduct,它有一个status列,可以是'a'(活动)或'D'(已删除) 以及PurchaseProductGroup中定义的多对多关系: /** The purchase products linked to this group. */ @ManyToMany @JoinTable(name = "purchaseprodgrp_purchaseprod", joinColumns =
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;
/**链接到此组的购买产品*/
@许多
@JoinTable(name=“purchaseprodgrp\u purchaseprod”,
joinColumns=@JoinColumn(name=“ppg_id”),
inverseJoinColumns=@JoinColumn(name=“ppr\u id”))
私人清单采购产品;
我如何限制这一点,以便排除状态为'D'
的采购产品
我尝试过的事情
已尝试在@manytomy
注释下方添加以下内容,但均失败,列出现“无效标识符”异常:
@Where(clause=“status'D')
@WhereJoinTable(子句=“purchaseProduct.status'D')
还尝试在实体级别添加
@Where(clause=“status'D')
,但这似乎不会影响关系集合的内容-由备份。请尝试以下代码:
@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\u status
,则可能不需要@列。但是根据您上面的评论,我们需要告诉Hibernate如何映射此列
参考资料:我不确定你到底想用Hibernate做什么。如果支持,我们可以在status
列本身上添加检查约束,但这将从表中完全排除所有'D'
值。您最终可能使用的方法只是在查询中添加一个WHERE
子句。顺便说一句,这并不是最糟糕的事情,尤其是如果你正确地调整了你的查询。我更希望在代码中处理实体本身时,删除的记录总是被排除在外(而不是使用显式查询)。对列本身设置约束的第一个建议似乎很好,请您进一步解释如何做到这一点?不,约束方法对您不起作用,因为它会阻止所有具有'D'
的记录进入数据库。我可能会在这里使用WHERE
子句。无论如何,如何提取实际数据的逻辑属于things IMO的查询端。我假设约束方法将把@Where(子句=“status'D')
放在PurchaseProduct
实体的顶部。你是说如果它试图通过调用setStatus('D')
来更新持久化的PurchaseProduct
,那么这实际上会阻止删除工作吗?请编辑你的问题,并告诉我们你将@where
和@WhereJoinTable
注释放置在哪里。很好,这非常有效,谢谢你的帮助!现在,我提出了一个类似的问题。谢谢,并为我之前的评论道歉,因为我不是HibernateAPI所有部分的专家。
@Column(name="ppr_status")
public String getStatus() {
return status;
}