2

我希望能够更新我有一个 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

谢谢

4

2 回答 2

3

您可以在 GORM 域类上使用executeUpdate 方法:

Foo.executeUpdate("update Foo f set f.a=:a, f.b=:b where f.id=:id", data)
于 2012-11-13T08:13:15.840 回答
3

只要您的映射键与您的对象属性具有相同的名称,您就可以使用 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)

或者当然你可以将它们组合成一个闭包或函数。

于 2012-11-14T18:41:04.500 回答