如何清除JPQL中的集合关联?

时间:2012-09-18 11:12:54

标签: hibernate jpa-2.0

考虑以下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以将条形集合设置为null。那要快得多。

不幸的是,关联是单向的 - 因此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。但也许有人在这里知道一个解决方法吗?

2 个答案:

答案 0 :(得分:0)

在集合上运行clear,假设删除所有关系。 您不能在HQL中执行此操作,但使用session.get将有助于提高性能。 请参阅此post

答案 1 :(得分:0)

JPQL更新和删除查询仅适用于单个实体类的实体,因此无法实现您要实现的目标。但是,如用户1495181建议您可以在收集时调用清除。当在事务结束时刷新实体管理器时,所有链接更新(此处链接都被删除)语句将被添加到预准备语句批处理并发送到数据库。