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

时间:2012-11-13 02:33:24

标签: groovy gorm

我希望能够更新以前持久化的对象,我有一个id,而不必先检索它。我试图避免的主要问题是,当从数据库中检索到该对象时,必须将多个值复制到对象的字段中。我在地图中有这些值,其中键对应于字段名称,因此通过构造函数以地图作为参数创建对象是微不足道的。不幸的是,即使将id字段设置为现有记录的id字段,以这种方式创建的对象也会在保存时生成新的数据库记录。

我目前正在使用here显示的一个示例略微修改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

由于

2 个答案:

答案 0 :(得分:3)

您可以在GORM域类上使用executeUpdate method

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

答案 1 :(得分: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)

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