如何使用 JPQL 删除 ManyToMany 项目?

Posted

技术标签:

【中文标题】如何使用 JPQL 删除 ManyToMany 项目?【英文标题】:How to delete a ManyToMany item using JPQL? 【发布时间】:2011-09-24 09:48:01 【问题描述】:

我有两个模型,比如说:

BlogPost(title, message)
Tags(name)

两者都定义了多对多关系。

使用 JPQL,我通过以下查询删除了 BlogPost 列表:

DELETE FROM BlogPost b WHERE b IN :list

(:list 是来自前一个 SELECT 请求的列表)。

这样做,由于BlogPostTags 之间的关系,我有一个ConstraintViolationException

有没有办法在不使用 JPQL 删除标签的情况下删除关系?

感谢您的帮助!

【问题讨论】:

可能重复:***.com/questions/1082095/… 【参考方案1】:

您必须先删除关联,然后才能删除实体。

【讨论】:

我该如何使用 jpql 做到这一点? 您不能对 JPQL 执行此操作。您可以通过操作实体对象来做到这一点。如果它们在同一个事务中附加和维护,那么应该没问题。 你能告诉我如何操作实体对象吗?我想要做的是删除许多 BlogPost 而不必执行循环并为每个条目调用 ->delete()。只需在一个查询中完成。【参考方案2】:

JPA 创建一个表 BlogPost_Tags 存储 BlogPost 和标签的 ID。

因此,当您尝试删除 BlogPost 时,BlogPost_Tags 上的约束失败。

删除Post前需要先删除关系,JPQL没有简单的方法,必须使用EntityManager。

【讨论】:

【参考方案3】:

我会用我想出的解决方案来回答自己。我不确定它是不是最好的,但至少它有效。

由于您要批量删除具有 ManyToMany 相关项的内容,因此您首先必须删除关系(在连接表中),或者执行循环并为每个项手动删除(疯狂且过于繁重)。

因此,由于 JPQL 不允许这样做,一种可能的方法是进行 本机 SQL 查询以删除相关表中所需的 id,然后进行批量删除。

【讨论】:

以上是关于如何使用 JPQL 删除 ManyToMany 项目?的主要内容,如果未能解决你的问题,请参考以下文章

JPQL manyToMany 单向查询

多对多查询 jpql

JPQL 查询中的@OrderColumn

清除与 JPA / JPQL 的多对多关系

如何在 jpql 中为 in-clause 设置集合项?

JPQL 查询:属于多个类别的项目