使用groovy从对象更新SQL

问题描述:

当您在Groovy中读取结果集时,它会包含一组地图。使用groovy从对象更新SQL

看起来像你应该能够更新那些地图内的值并将它们写回去,但我找不到任何内置Groovy的东西来允许我这样做。

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

它似乎只是几行代码,所以我宁愿不为此引入休眠。我只是想一点“更新”的方法,将允许:

 
def rows=sql.rows(query) 
rows[0].name="newName" 
update(sql, rows[0]) 

更新数据库中第一个人的名字。任何人看到/创建这样一个怪物,或者像这样的东西已经内置到Groovy Sql中,我只是想念它吗?

(我想你可能要指出的更新方法,其领域是关键领域,但是这是可行的......)

使用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

+0

我真的很喜欢那样,不知道你可以这样做。它不太适合我的问题(我真的想更新我刚才查询的内容),但它将在未来非常有用。 – 2013-02-09 00:52:55

+0

实际上,如果使用这种模式并且知道唯一键,他可以遍历相同的确切查询以搜索与原始结果相同的键,请复制修改后的字段,然后将每个修改后的记录写回 - 这将非常接近我想要的是... – 2013-02-09 01:11:16