使用groovy从对象更新SQL
问题描述:
当您在Groovy中读取结果集时,它会包含一组地图。使用groovy从对象更新SQL
看起来像你应该能够更新那些地图内的值并将它们写回去,但我找不到任何内置Groovy的东西来允许我这样做。
我正在考虑编写一个例程,它允许我通过遍历其中一个结果对象的字段来编写修改后的映射,获取每个键/值对并使用它们来创建适当的更新语句,但它可以烦人,所以我想知道是否有其他人已经做到了这一点,或者如果它已经可以在常规中得到应用。
它似乎只是几行代码,所以我宁愿不为此引入休眠。我只是想一点“更新”的方法,将允许:
def rows=sql.rows(query) rows[0].name="newName" update(sql, rows[0])
更新数据库中第一个人的名字。任何人看到/创建这样一个怪物,或者像这样的东西已经内置到Groovy Sql中,我只是想念它吗?
(我想你可能要指出的更新方法,其领域是关键领域,但是这是可行的......)
答
使用rows
方法实际上将读出所有的值到List
GroovyRowResult
,所以如果不创建像你提到的更新方法,就不可能更新数据。
这不是真的有可能做的是,在一般情况下,因为你的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
。
我真的很喜欢那样,不知道你可以这样做。它不太适合我的问题(我真的想更新我刚才查询的内容),但它将在未来非常有用。 – 2013-02-09 00:52:55
实际上,如果使用这种模式并且知道唯一键,他可以遍历相同的确切查询以搜索与原始结果相同的键,请复制修改后的字段,然后将每个修改后的记录写回 - 这将非常接近我想要的是... – 2013-02-09 01:11:16