我正在尝试从静态类型语言调用groovy.sql.Sql.batch
。
我在回调对象ps
上成功调用addBatch
,参数类型为List
。这对于像insert into TABLENAME(a, b, c) values (?, ?, ?)
这样的语句很有效。
引用文档:
Named parameters (into maps or domain objects) are also supported:
def updateCounts = sql.withBatch(20, 'insert into TABLENAME(a, b, c) values (:foo, :bar, :baz)') { ps ->
ps.addBatch([foo:10, bar:12, baz:5]) // map
ps.addBatch(foo:7, bar:3, baz:98) // Groovy named args allow outer brackets to be dropped
...
}
所以,我想也支持使用批量更新地图。问题是,BatchingPreparedStatementWrapper类型的回调参数不提供方法addBatch(Map)
,而只是重载addBatch(Object[])
,addBatch(List)
,addBatch(String)
。
Sql.withBatch
如何与kotlin或java的Map参数一起使用?它如何在groovy中工作而不抛出NoSuchMethodError MissingMethodException之类的?
def f(Object[] p){
println p
}
f( a:1, b:2, c:3 )
works fine and print:
[[a:1, b:2, c:3]]
所以,如果你有f(Object[] x)
函数,那么f(a:123)
等于f( [ [a:123] ] )
这意味着从Java下面应该工作:
Map params = new HashMap();
params.put("a", 123);
ps.addBatch( new Object[]{ params } );