6

私は PostgreSQL 9.4 とすばらしい JSONB フィールド タイプを使用しています。ドキュメント内のフィールドに対してクエリを実行しようとしています。以下はpsql CLIで機能します

SELECT id FROM program WHERE document -> 'dept' ? 'CS'

Scala アプリで同じクエリを実行しようとすると、以下のエラーが発生します。私は Play フレームワークと Anorm を使用しているので、クエリは次のようになります。

SQL(s"SELECT id FROM program WHERE document -> 'dept' ? {dept}")
.on('dept -> "CS")
....

SQLException: : パラメーター 5 に値が指定されていません。 (SimpleParameterList.java:223)

(私の実際のクエリでは、より多くのパラメーターがあります)

パラメーターを型にキャストjsonbし、演算子を使用して@>包含をチェックすることで、これを回避できます。

SQL(s"SELECT id FROM program WHERE document -> 'dept' @> {dept}::jsonb")
.on('dept -> "CS")
....

私は周りの仕事にあまり熱心ではありません。キャストにパフォーマンスのペナルティがあるかどうかはわかりませんが、それは余分なタイピングであり、明白ではありません。

他にできることはありますか?

4

4 に答える 4

5

JDBC (および標準 SQL) では、疑問符はパラメーターのプレースホルダーとして予約されています。他の使用は許可されていません。

JDBC 仕様は「?」を防止しますか?を参照してください。演算子として(引用符の外で)使用されないようにしますか?jdbc-spec-discuss に関する議論。

現在の PostgreSQL JDBC ドライバーは、出現するすべての (テキストまたはコメントの外側の) 疑問符を PostgreSQL 固有のパラメーター プレースホルダーに変換します。PostgreSQL JDBC プロジェクトがこれに対処するために何か (上記のリンクで説明されているようにエスケープを導入するなど) を行ったかどうかはまだわかりません。コードとドキュメントをざっと見てみると、そうではないことがわかりますが、あまり深く掘り下げませんでした。

補遺: bobmarksie による回答に示されているように、現在のバージョンの PostgreSQL JDBC ドライバーは、疑問符を 2 倍にしてエスケープすることをサポートするようになりました (つまり、??の代わりに使用します?)。

于 2014-12-20T08:51:52.693 に答える