我试图在一个表中设置基于另一个表的两个可能列之一的列。由于HQL更新不支持连接,我试图解决并在set
语句中使用OR
,但是,我找不到太多关于它的文档。
类似的查询似乎可以在某些类型的SQL中工作,但我似乎无法在Groovy的HQL中工作:
String queryString = """
update Foo foo
set foo.myValue = (
(foo.fooType = :typeBar AND :barFlag = true) OR
(foo.fooType = :typeBaz AND :bazFlag = true)
)"""
Map args = [
typeBar: Type.BAR,//String
typeBaz: Type.BAZ,//String
barFlag: bar,//Boolean
bazFlag: baz,//Boolean
]
Foo.executeUpdate(queryString, args)
我得到的例外是:
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: OR near line ...
看起来你不能在HQL update
语句中使用表达式。必须将其分解为两个查询,例如:
String queryString = """
update Foo foo
set foo.myValue = :bar
where foo.fooType = :type"""
Map args = [
type: Type.BAR,//String
flag: bar,//Boolean
]
Foo.executeUpdate(queryString, args)
然后是类似的baz
类型