在 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'
}
我的 类 中有以下关联:
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()
生成类似于
的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
中的 return 值 - 删除的行数不是特别有趣:
void detachAllAsFromBs() {
new Sql(dataSource).executeUpdate 'delete from b_a'
}