2

考虑以下 JPQL 查询:

UPATE FOO f SET f.bars = NULL

运行此语句将产生异常:

java.lang.IllegalArgumentException: org.hibernate.QueryException: collections not assignable in update statements [UPATE FOO f SET f.bars = NULL ]

我想要做的是在一个声明中切断FOO 和 BAR 之间的所有关联。而不是遍历每个 FOO 以将条集合设置为空。那要快得多。

不幸的是,该关联是单向的——因此 Bar 实体中没有foo属性。因此 JPQL 可以清除关联的另一端。

调用 NEW 也不起作用:

UPATE FOO f SET f.bars = NEW java.util.ArrayList()

这会导致不同的异常:

java.lang.IllegalArgumentException: node to traverse cannot be null!

很明显,JPA/Hibernate 不允许将集合关联设置为 null。但也许这里有人知道解决方法?

4

2 回答 2

0

对集合运行 clear 假设删除所有关系。您不能在 HQL 中执行此操作,但使用 session.get 将有助于提高性能。看到这个帖子

于 2012-09-18T12:05:22.970 回答
0

JPQL 更新和删除查询仅适用于单个实体类的实体,因此您尝试实现的目标是不可能的。但是,正如 user1495181 建议的那样,您可以在收集时调用 clear。当实体管理器在事务结束时被刷新时,所有链接更新(这里链接被删除)语句将被添加到准备好的语句批处理中并发送到数据库。

于 2012-09-18T12:51:36.837 回答