【问题标题】:GORM - Update object without retrieving it firstGORM - 更新对象而不先检索它
【发布时间】:2012-11-13 02:33:24
【问题描述】:

我希望能够更新以前保存的对象,我有一个 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

谢谢

【问题讨论】:

  • 请注意,我希望找到类似于上面虚构的 update() 语句的内容,不需要通过将它们复制到对象或 SQL 语句等中来指定各个字段。

标签: groovy grails-orm


【解决方案1】:

只要您的映射键与您的对象属性同名,您就可以使用 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(foo, data) )。
  • 哦,是的,我想这会很有用。 foo.class.name 会给你类名,然后希望数据库表名也是如此。
【解决方案2】:

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

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

【讨论】:

  • 是的,我知道。我一直在寻找可以在不引用单个字段的情况下进行更新的东西——基本上是不那么冗长的东西。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2018-10-25
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
相关资源
最近更新 更多