Groovy GORM-更新对象而不首先检索它

Groovy GORM-更新对象而不首先检索它,groovy,gorm,Groovy,Gorm,我希望能够更新我有id的以前持久化的对象,而不必首先检索它。我试图避免的主要事情是,当从数据库检索对象时,必须将多个值复制到对象的字段中。我将这些值放在一个映射中,映射的键对应于字段名,因此通过一个构造函数将映射作为参数来创建对象是很简单的。不幸的是,以这种方式创建的对象在保存时会产生新的数据库记录,即使id字段设置为现有记录的id字段 目前,我在所示的复制Groovy类属性的示例中使用了一个小小的变体,但由于多种原因,它不是一个非常优雅的解决方案 基本上,我希望能够做到这样: class Fo

我希望能够更新我有id的以前持久化的对象,而不必首先检索它。我试图避免的主要事情是,当从数据库检索对象时,必须将多个值复制到对象的字段中。我将这些值放在一个映射中,映射的键对应于字段名,因此通过一个构造函数将映射作为参数来创建对象是很简单的。不幸的是,以这种方式创建的对象在保存时会产生新的数据库记录,即使id字段设置为现有记录的id字段

目前,我在所示的复制Groovy类属性的示例中使用了一个小小的变体,但由于多种原因,它不是一个非常优雅的解决方案

基本上,我希望能够做到这样:

class Foo {
    int a
    String b
}

def data = [id: 99, a: 11, b: "bar"]    //99 is the id of an existing record
def foo = new Foo(data)
foo.update()    //or some other comparable persistence mechanism
谢谢

您可以在GORM域类上使用:

Foo.executeUpdate("update Foo f set f.a=:a, f.b=:b where f.id=:id", data)

只要映射键与对象属性具有相同的名称,就可以使用executeUpdate,而无需使用闭包或函数指定单个属性名称,如下所示:

def updateString = { obj, map ->
        def str = ""
        map.each { key, value ->
            str += "${obj}.${key}=:${key},"
        }

        return str[0..-2]
    }

    def data= [foo:"bar", machoMan:"RandySavage"]
在这种情况下,
println updateString(“f”,data)
返回
“f.foo=:foo,f.machoMan=:machoMan”

然后你可以这样做:

Foo.executeUpdate("update Foo f set ${updateString("f", data)}", data)

当然,你也可以将所有这些组合成一个闭包或函数。

是的,我知道。我在寻找一种允许在不引用单个字段的情况下进行更新的方法——基本上是一种不太冗长的方法。无论如何,谢谢。请注意,我希望找到类似于上面虚构的update()语句的东西,它不需要通过将字段复制到对象或SQL语句等来指定单个字段。这是一种有趣的方法。我必须仔细研究它,找出如何设置一个通用的闭包/函数,它可以只传递对象和映射(例如更新(foo,data))。哦,是的,我想这会很有用
foo.class.name
将为您获取类名,然后最好是DB表名。