我的课程中有以下关联:
class A {
}
class B {
static hasMany = [
objects: A
]
}
我想使用HQL查询来删除所有B的关联。
以下是我的尝试:
B.executeUpdate("update B b set b.objects.id=NULL")
但前者没有用。
如何删除HasMany Association fin HQL?
答案 0 :(得分:1)
由于您希望保留所有A和B实例,但只是将它们分离,但是这样做的净效果是连接表将被清空。最有效的方法是使用SQL:
delete from b_a
我无法通过HQL找到任何方法,因为连接表未被映射 - 它由Hibernate为您管理(就像在多对多中一样),但你无法直接访问它。通常,您将使用Groovy / Java代码中的实例,例如要删除一个B
实例的A
,您可以执行此操作:
B b = ...
b.objects.clear()
b.save()
生成类似于
的SQLdelete 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之间的关系应该是静态的吗?那个地方的静电似乎是错误的,但没有堆栈痕迹或更多细节,很难说。