Jdbi: يتعذر على BindList العثور على المعلمة المسماة في الاستعلام ويقوم بطرح استثناء

تم إنشاؤها على ١ فبراير ٢٠١٨  ·  4تعليقات  ·  مصدر: jdbi/jdbi

حصلت على استعلام SQL بمعامل مسمى :featureIds

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);"

عندما أحاول ربط قائمة Ints بالمعامل المحدد

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 ، فيمكنك ربط القوائم كمصفوفات SQL باستخدام where featureIds = any(:featureIds) في الاستعلام وباستخدام bindByType("featureIds", featureIds, new GenericType<List<Long>>() {}) .

ليس للزومبي ، ولكن عند استخدام 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 التقييمات

القضايا ذات الصلة

qualidafial picture qualidafial  ·  3تعليقات

raderio picture raderio  ·  6تعليقات

electrum picture electrum  ·  3تعليقات

bakstad picture bakstad  ·  5تعليقات

stevenschlansker picture stevenschlansker  ·  4تعليقات