Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何将where子句添加到Hibernate@ManyToMany关系中?_Oracle_Hibernate_Many To Many_Jointable_Hibernate Filters - Fatal编程技术网

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;
    }