如何使用 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 请求的列表)。
这样做,由于BlogPost
和Tags
之间的关系,我有一个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 项目?的主要内容,如果未能解决你的问题,请参考以下文章