考虑以下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。但也许有人在这里知道一个解决方法吗?
答案 0 :(得分:0)
在集合上运行clear,假设删除所有关系。 您不能在HQL中执行此操作,但使用session.get将有助于提高性能。 请参阅此post
答案 1 :(得分:0)
JPQL更新和删除查询仅适用于单个实体类的实体,因此无法实现您要实现的目标。但是,如用户1495181建议您可以在收集时调用清除。当在事务结束时刷新实体管理器时,所有链接更新(此处链接都被删除)语句将被添加到预准备语句批处理并发送到数据库。