Jdbi: рдмрд╛рдЗрдВрдбрд▓рд┐рд╕реНрдЯ рдХреНрд╡реЗрд░реА рдореЗрдВ рдореЗрд░рд╛ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдлрд╝рд░ре░ 2018  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jdbi/jdbi

рдореБрдЭреЗ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ :featureIds . рдХреЗ рд╕рд╛рде рдПрдХ SQL рдХреНрд╡реЗрд░реА рдорд┐рд▓реА рд╣реИ

const val selectGeoCoordinates = "SELECT gg.feature_id, gg.latitude, gg.longitude, gg.order, gg.group FROM geo.geo_coordinates as gg WHERE gg.feature_id IN (:featureIds);"

рдЬрдм рдореИрдВ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЗрдирдЯреНрд╕ рдХреА рд╕реВрдЪреА рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ

val values: List<Int> = listOf(4138, 1752, 1161, 371, 1860, 5498)
val geoCoordinatesList = geo.withHandle<List<GeoCoordinates>, Exception> { handle ->
                handle.createQuery(selectGeoCoordinates).bindList("featureIds", values)
                        .mapTo<GeoCoordinates>().list()
            }

рдореБрдЭреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдирд┐рдореНрди рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ:

    Caused by: org.jdbi.v3.core.statement.UnableToExecuteStatementException: Unable to execute, no named parameter matches 'featureIds'. [statement:"SELECT gg.feature_id, gg.latitude, gg.longitude, gg.order, gg.group FROM geo.geo_coordinates as gg WHERE gg.feature_id IN :featureIds ;", rewritten:"SELECT gg.feature_id, gg.latitude, gg.longitude, gg.order, gg.group FROM geo.geo_coordinates as gg WHERE gg.feature_id IN :featureIds ;", parsed:"ParsedSql{sql='SELECT gg.feature_id, gg.latitude, gg.longitude, gg.order, gg.group FROM geo.geo_coordinates as gg WHERE gg.feature_id IN ? ;', parameters=ParsedParameters{positional=false, parameterNames=[featureIds]}}", arguments:{ positional:{}, named:{__featureIds_0:4138,__featureIds_4:1860,__featureIds_3:371,__featureIds_2:1161,__featureIds_1:1752,__featureIds_5:5498}, finder:[]}]
    at org.jdbi.v3.core.statement.ArgumentBinder.lambda$bindNamed$0(ArgumentBinder.java:58)
    at java.util.Optional.orElseThrow(Optional.java:290)
    at org.jdbi.v3.core.statement.ArgumentBinder.bindNamed(ArgumentBinder.java:57)
    at org.jdbi.v3.core.statement.ArgumentBinder.bind(ArgumentBinder.java:27)
    at org.jdbi.v3.core.statement.SqlStatement.internalExecute(SqlStatement.java:1443)
    at org.jdbi.v3.core.result.ResultProducers.lambda$getResultSet$2(ResultProducers.java:59)
    at org.jdbi.v3.core.result.ResultIterable.lambda$of$0(ResultIterable.java:53)
    at org.jdbi.v3.core.result.ResultIterable.stream(ResultIterable.java:141)
    at org.jdbi.v3.core.result.ResultIterable.collect(ResultIterable.java:197)
    at org.jdbi.v3.core.result.ResultIterable.list(ResultIterable.java:186)

рдЕрдЧрд░ рдореИрдВ .bind("featureIds", 4138) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдордХрд░рдг рд╕рд╣реА рд╣реИред

рдХрд┐рд╕реА рдФрд░ рдХреЛ рдпрд╣ рдорд┐рд▓рд╛? рдХрд┐рд╕реА рднреА рдорджрдж рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реИрд░рд╛рди рд╣реВрдВ :(

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдареАрдХ рд╣реИ... StringTemplateEngine рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред рдЬрдм рдореИрдВ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ <> рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
"SELECT gg.feature_id, gg.latitude, gg.longitude, gg.order, gg.group FROM geo.geo_coordinates as gg WHERE gg.feature_id IN (<featureIds>);"

.bindList("featureIds", values) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ bindList рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ? :)

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдареАрдХ рд╣реИ... StringTemplateEngine рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред рдЬрдм рдореИрдВ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ <> рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
"SELECT gg.feature_id, gg.latitude, gg.longitude, gg.order, gg.group FROM geo.geo_coordinates as gg WHERE gg.feature_id IN (<featureIds>);"

.bindList("featureIds", values) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ bindList рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ? :)

рд╣рд╛рдВ, рдмрд╛рдЗрдВрдбрд▓рд┐рд╕реНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ <featureIds> рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ :__featureIds_0, :__featureIds_1, ...etc рдФрд░ рд╕реВрдЪреА рддрддреНрд╡реЛрдВ рдХреЛ рдЙрди рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдЪрд░реЛрдВ рд╕реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреНрд╡реЗрд░реА рдореЗрдВ where featureIds = any(:featureIds) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ bindByType("featureIds", featureIds, new GenericType<List<Long>>() {}) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ SQL рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдБрдз рд╕рдХрддреЗ рд╣реИрдВред

рдЬрд╝реЛрдВрдмреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди bindMap Map<String, Object> рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╕рдордп рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдПрдХрд▓ рдХреБрдВрдЬреА рдореЗрдВ List рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ bindList рдХреЗ рд╕рд╛рде рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдЯреАрдХ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг:

  a,b,c
from
  table
where
  a = :some_string
  and b = ANY(<list_of_strings>)

рдХреЗ рдмрдВрдзрди рдХреЗ рд╕рд╛рде:

.bindMap(Map.of(
  'some_string', 'foobar',
  'list_of_strings', Lists.newArrayList('q', 'r', 's')
))

рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛:

org.jdbi.v3.core.statement.UnableToCreateStatementException: Undefined attribute for token '<list_of_strings>' 

рдпрд╣ рд╕рд╣реА рд╣реИред bindMap рдХреЗрд╡рд▓ рддрд░реНрдХреЛрдВ рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ bindList рдХреЛ рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХреЗред рд╡реЗ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jimmyhmiller picture jimmyhmiller  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rherrmann picture rherrmann  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

buremba picture buremba  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

qualidafial picture qualidafial  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

agavrilov76 picture agavrilov76  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ