【问题标题】:How to clear collection associations in JPQL?如何清除 JPQL 中的集合关联?
【发布时间】:2012-09-10 15:36:10
【问题描述】:

考虑以下 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 ]

我正在尝试做的是在 one 声明 all 中切断 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。但也许这里有人知道解决方法?

【问题讨论】:

    标签: hibernate jpa-2.0


    【解决方案1】:

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

    【讨论】:

    • 有什么特殊原因是不可能的吗?
    【解决方案2】:

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

    【讨论】:

    • 没错。但为了性能,我试图在一个 JPQL 语句中做到这一点。
    猜你喜欢
    • 2019-05-07
    • 2010-10-15
    • 2020-11-26
    • 2012-11-17
    • 1970-01-01
    • 2018-02-12
    • 2011-11-09
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多