Я пытаюсь вызвать groovy.sql.Sql.batch из языка со статической типизацией.
Мне удалось вызвать addBatch
объект обратного вызова ps
с параметром типа 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
с параметрами Map из kotlin или java? И как это на самом деле работает в groovy без выбрасывания NoSuchMethodError, MissingMethodException или чего-то еще?
@dagget: Просто нажмите гиперссылку с пометкой BatchingPreparedStatementWrapper
. AddBatch (карта) отсутствует. Просто добавьте пакет (список).
в groovy следующий код:
def f(Object[] p){
println p
}
f( a:1, b:2, c:3 )
работает нормально и печатает:
[[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 } );
Ух ты. Работает как шарм! singletonList, содержащий карту, делает свое дело
не могли бы вы показать javadoc для java addBatch (карта)?