我希望能够更新以前持久化的对象,我有一个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
由于
答案 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)
当然,您可以将所有这些组合成一个闭包或函数。