Bindowanie parametrów zapytania w chainowanym interfejsie

0

Kod JDBI - bez parametrów SQL

var mapper = new SomethingJdbiMapper();
List<Something> list = jdbi.withHandle(handle -> handle.createQuery(_query).map(mapper).list());

pojedynczy parametr się wprowadza bind

List<Something> list = jdbi.withHandle(handle -> handle.createQuery(_query).bind("type",object). map(mapper).list());

Mam zmienną ilość parametrów w Map. Czytanie dokumentacji nie wskazuje na taki case

Map<String,Object> pars; 
... 
List<Something> list = jdbi.withHandle(handle -> handle.createQuery(_query). XXXXXX(pars) . map(mapper).list());

Da się to napisać w "starej brzydkiej pętli" robiąc po jeden bind - a jak funkcyjnie ?

0

Oooops, utrudnienie

Parametr posiadający wartość

List<Something> list = jdbi.withHandle(handle -> handle.createQuery(_query).bind("invoiceType",object). map(mapper).list());

Ale parametr null

List<MyExpando> list = jdbi.withHandle(handle -> handle.createQuery(_query).bindNull("invoiceType", /*int*/ sqlType).map(mapper).list());

Mam ochotę zostać przy podobno "brzydkiej" pętli, jeszcze ten sqlType trzeba wypracować ....

0

Przydałby się foldLeft. Wtedy można by zrobić:

var initSQL = handle.createQuery(_query);
var bindedSQL = parameterMap.foldLeft (initSQL, (parameterTuple, currentSQL) -> 
   (parameterTuple.value != null) 
     ? currentSQL.bind(parameterTuple.key, parameterTuple.value) 
     : currentSQL.bindNull(parameterTuple.key) 
)
bindedSQL.list()

Bez porządnego foldLefta działającego na Mapie tego nie da się zrobić bez modyfikacji statu
BTW w programowaniu funkcyjnym to fold/foldLeft jest podstawą do implementacji map, filter

1 użytkowników online, w tym zalogowanych: 0, gości: 1