Jdbi: postgresでjsonb疑問符演算子をエスケープする

作成日 2015年09月18日  ·  6コメント  ·  ソース: jdbi/jdbi

私はpostgresとjsonbでjdbiを使用して、次のようなクエリを作成しようとしています。

select id, data from some_table where data ? :key

残念ながら、jdbiはこの疑問符を変数のプレースホルダーとして解釈します。 postgresの疑問符演算子を使用できるように疑問符をエスケープするにはどうすればよいですか?

最も参考になるコメント

これはjdbcのアップストリームの問題であることが判明しました。 彼らはそれを回避する方法を実装しました。 あなたは??を使用する必要があります。 そのようです:

select id, data from some_table where data ?? :key

全てのコメント6件

バックスラッシュ\?を試しましたか?

ええ、私はそれについて言及すべきだったと思います。 それが私の最初の本能でした。 しかし、それでもエラーが発生します。

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を使用して実行すると、エラーがスローされます。

Javaコード

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ではなくJdbiプロジェクトであることに注意してください。 :)

このページは役に立ちましたか?
0 / 5 - 0 評価