在Groovy HQL更新中使用表达式



我试图在一个表中设置基于另一个表的两个可能列之一的列。由于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类型

最新更新