【问题标题】:Is it possible to bulk delete from a many-many association with HQL?是否可以从与 HQL 的多对多关联中批量删除?
【发布时间】:2010-11-15 03:50:27
【问题描述】:

如果是这样,语法是什么?

假设我希望 Foo 的一个实例与 Bar 的所有实例不关联: 在 SQL 中,它只是:

delete from FOO_BAR_MAPPING
where FOO_ID = ?

在 HQL 中,我假设它是这样的:

delete from Bar.foos foos
where foos.id = :id

(其中 foos 是 Foo 的映射集合)

但是好像错了,给:

org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped

HQL 甚至可以做到这一点吗?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    使用 HQL 无法单独删除关联。但是,您可以做的是:

    A) 假设您正在为单个 Foo 执行此操作并且您的级联设置正确,您可以加载该 Foo 实例,清除其 bars 集合并保存它。

    B) 如果您尝试从多个 Foos 中清除 bars,您可以映射 SQL 查询而不是 HQL

    【讨论】:

      【解决方案2】:

      要回答您的具体问题,不,据我所知,使用 HQL 是不可能的。

      我认为您在这里混合了 SQL 和 HQL。在 SQL 中,您确实会“删除”记录,当然 hibernate 最终也会这样做。然而,Hibernate/HQL 是从面向对象的思维方式设计的,因此在这种情况下,“删除”意味着您正在删除对象,而不是关联。通常你会做如下的事情:

      Foo f = session.get(Foo.class, id);
      f.getBars().clear();
      session.merge(f);
      

      这将通过您指定的 id 检索对象,并通过清除它的集合来删除所有 Bar 关联。显然,您必须将 Foo-Bars 关联映射到正确的方向才能正常工作。

      【讨论】:

      • 请注意,这只会删除关联表条目,而不是最后的元素。为此,您需要打开 delete-orphans。
      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多