【问题标题】:Updating SQL from object with groovy使用 groovy 从对象更新 SQL
【发布时间】:2013-02-08 23:49:56
【问题描述】:

当您在 Groovy 中读取结果集时,它会出现在一组映射中。

似乎您应该能够更新这些映射中的值并将它们写回,但我找不到任何内置到 groovy 中的东西来允许我这样做。

我正在考虑编写一个例程,允许我通过迭代其中一个结果对象的字段、获取每个键/值对并使用它们创建适当的更新语句来编写修改后的映射,但它可能是烦人,所以我想知道是否有其他人这样做过,或者它是否已经在 groovy 中可用。

这似乎只是几行代码,所以我宁愿不为此引入 hibernate。我只是在想一种允许的“更新”方法:

def 行=sql.rows(查询) 行[0].name="新名称" 更新(sql,行[0])

更新数据库中第一个人的名字。任何人都见过/创造了这样一个怪物,还是像这样的东西已经内置在 Groovy Sql 中而我只是想念它?

(我想你可能需要指出更新方法中哪个字段是关键字段,但这是可行的......)

【问题讨论】:

    标签: sql groovy


    【解决方案1】:

    使用rows 方法实际上会将所有值读入ListGroovyRowResult,因此如果不创建像您提到的那样的更新方法,实际上是不可能更新数据的。

    在一般情况下实际上不可能这样做,因为您的 query 可以包含连接或作为聚合的列引用等。

    如果您从单个表中进行选择,请使用Sql.eachRow 方法并将ResultSet 设置为可更新表,您可以使用底层ResultSet 接口在迭代时进行更新:

    sql.resultSetConcurrency = ResultSet.CONCUR_UPDATABLE
    sql.resultSetType = ResultSet.TYPE_FORWARD_ONLY
    sql.eachRow(query) { row ->
        row.updateString('name', 'newName')
        row.updateRow()
    }
    

    根据您使用的数据库/驱动程序,您可能无法创建可更新的ResultSet

    【讨论】:

    • 我真的很喜欢这样,不知道你可以那样做。它不太适合我的问题(我真的很想更新我刚才查询的东西),但它在未来会非常有用。
    • 实际上,如果一个人使用这种模式并且知道唯一键,他可以遍历相同的确切查询,搜索与原始结果相同的键,复制修改后的字段,然后将每条修改后的记录写回输出- - 这将非常接近我想要的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多