在HQL中删除HasMany关联

时间:2015-01-15 17:29:13

标签: hibernate grails 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?

2 个答案:

答案 0 :(得分:1)

由于您希望保留所有A和B实例,但只是将它们分离,但是这样做的净效果是连接表将被清空。最有效的方法是使用SQL:

delete from b_a

我无法通过HQL找到任何方法,因为连接表未被映射 - 它由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的返回值 - 删除的行数并不特别有趣:

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

答案 1 :(得分:0)

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

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

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