Jdbi: BindListはクエリで名前付きパラメーターを見つけることができず、例外をスローします

作成日 2018年02月01日  ·  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);"

Intのリストを名前付きパラメーターにバインドしようとすると

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の例を提供しますか? :)

はい、bindListは実際に<featureIds>をたとえば:__featureIds_0, :__featureIds_1, ...etc $として定義し、リスト要素をそれらの代替変数にバインドします。

Postgresを使用している場合は、クエリでwhere featureIds = any(:featureIds)を使用し、 bindByType("featureIds", featureIds, new GenericType<List<Long>>() {})を使用して、リストをSQL配列としてバインドできます。

ゾンビではありませんが、1つのキーにListが含まれているMap<String, Object>bindMapを使用する場合、これは機能しないようです。 このようなパラメータは、マップとは別に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 評価

関連する問題

nonameplum picture nonameplum  ·  5コメント

agavrilov76 picture agavrilov76  ·  5コメント

Romqa picture Romqa  ·  5コメント

buremba picture buremba  ·  5コメント

rherrmann picture rherrmann  ·  4コメント