أحاول استخدام jdbi مع postgres و jsonb لكتابة استعلام مثل هذا:
select id, data from some_table where data ? :key
لسوء الحظ ، يفسر jdbi علامة الاستفهام هذه كعنصر نائب لمتغير. كيف يمكنني الهروب من علامة الاستفهام حتى أتمكن من استخدام عامل تشغيل علامة الاستفهام postgres؟
هل جربت الشرطة المائلة للخلف \?
؟
نعم ، أعتقد أنه كان يجب علي ذكر ذلك. كانت هذه أول غريزتي. لكن ما زلت أحصل على خطأ.
Exception in thread "main" org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.postgresql.util.PSQLException: No value specified for parameter 2. [statement:"select id, createdDate, data from something where data \? ?", located:"select id, createdDate, data from something where data \? ?", rewritten:"select id, createdDate, data from something where data ? ?", arguments:{ positional:{0:'pattern'}, named:{}, finder:[]}]
at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1334)
at org.skife.jdbi.v2.Query.fold(Query.java:173)
at org.skife.jdbi.v2.Query.list(Query.java:82)
at org.skife.jdbi.v2.Query.list(Query.java:75)
at com.ngc.vault.eventer.Query.hasKey(Query.java:45)
at com.ngc.vault.eventer.Main.main(Main.java:34)
Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2.
at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:228)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:163)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
... 5 more
تبين أن هذه مشكلة في المنبع في jdbc. لقد نفذوا طريقة للهروب منه. عليك أن تستخدم ؟؟. مثل ذلك:
select id, data from some_table where data ?? :key
استعلام Postgres
SELECT json_data FROM employee where json_data -> 'employee' @> '{"name":"Aman"}'
يعمل الاستعلام أعلاه بشكل جيد عند تشغيله في postgres. ولكن عند تشغيله باستخدام jdbctemplate ، فإنه يتسبب في حدوث خطأ.
كود جافا
String sql="SELECT json_data FROM employee where json_data -> 'employee' @> '{\"name\":\"?\"}'";
List<Map<String, Object>> emp = jdbcTemplate.queryForList(sql,param);
عند مواجهة السطر الأخير من الكود ، يظهر خطأ: - فهرس العمود خارج النطاق: 1 ، عدد الأعمدة: 0 .؛ الاستثناء المتداخل هو org.postgresql.util.PSQLException.
انها ليست قادرة على استبدال "؟" نائب.
وذلك وفقًا لمواصفات JDBC. لم يتم التعرف على علامات ?
كمعلمات داخل القيم الحرفية للسلسلة.
إذا كنت بحاجة إلى إقحام معلمة في سلسلة JSON تلك ، فاستخدم التسلسل. باستخدام صيغة سلسلة Postgres ، سيبدو الاستعلام بالشكل التالي:
SELECT json_data
FROM employee
WHERE json_data -> 'employee' @> ('{"name": "' || ? || '"}')
يرجى ملاحظة أن هذا هو مشروع جدبي وليس JdbcTemplate. :)
التعليق الأكثر فائدة
تبين أن هذه مشكلة في المنبع في jdbc. لقد نفذوا طريقة للهروب منه. عليك أن تستخدم ؟؟. مثل ذلك: