在 HQL 中移除 HasMany 关联

Remove HasMany Association in HQL

我的 类 中有以下关联:

class A {
}

class B {

 static hasMany = [
    objects: A
  ]
}

我想使用 HQL 查询从所有 B 中删除关联。

这是我尝试过的:

B.executeUpdate("update B b set b.objects.id=NULL")

但是前者没有用。

如何删除 HasMany Association fin HQL?

您应该能够删除关联,而不是一直到 ID。尝试:

B.executeUpdate("update B b set b.objects=NULL")

因为在评论中不起作用(我认为这是正确的语法):你确定 B 和 A 之间的关系应该是静态的吗?那个地方的静态似乎是错误的,但没有堆栈跟踪或更多细节很难说。

因为你想保留所有的 A 和 B 实例,但只是分离它们,不管你这样做的最终效果是连接 table 将被清空。最有效的方法是使用 SQL:

delete from b_a

我无法通过 HQL 找到任何方法,因为连接 table 未映射 - 它由 Hibernate 为您管理(就像在多对多中一样),但您没有任何直接访问它。通常,您会在 Groovy/Java 代码中使用实例,例如要删除一个 B 个实例的 A,您可以这样做:

B b = ...
b.objects.clear()
b.save()

生成类似于

的SQL
delete from b_a where b.id=?

但是一次只做一个显然效率很低,而且我在 Grails 或 Hibernate 方面都没有看到任何批量选项。所以我只是 运行 SQL 查询,使用 SQL 的最简单方法是 groovy.sql.Sql:

import groovy.sql.Sql

class MyService {

   def dataSource

   void detachAllAsFromBs() {
       Sql sql = new Sql(dataSource)
       int rowCount = sql.executeUpdate('delete from b_a')
       log.debug "removed $rowCount entries from b_a"
   }
}

您可以忽略 sql.executeUpdate 中的 return 值 - 删除的行数不是特别有趣:

void detachAllAsFromBs() {
    new Sql(dataSource).executeUpdate 'delete from b_a'
}