9

hstoreとPostgreSQLJDBCドライバー(9.1-901.jdbc4)でPostgreSQL9.1.4を使用しています。

PreparedStatementでcontains演算子(、、)を使用しようとしていますが、文字は?変数プレースホルダーとして解析されます。この文字をエスケープして、クエリで正しい演算子を送信できますか??&?|?

例:

PreparedStatement stmt = conn.prepareStatement("SELECT a, b FROM table1 WHERE c ? 'foo' AND d = ?");
stmt.setInt(1, dValue);
stmt.executeQuery();

この形式では、次の例で例外が発生します。

org.postgresql.util.PSQLException: No value specified for parameter 2.

アップデート:

pgjdbcドライバーでクエリパーサーを調査した後、このスニペット?は文字をエスケープできないことを示しているようです。残っている質問は次のとおりです。

  • JDBC仕様に、?をエスケープしてパラメータープレースホルダー以外のものにすることができるものはありますか?
  • クエリ文字列に変数を手動で挿入したプレーンステートメントを使用するよりも、この問題を回避するためのより良い回避策はありますか?
4

3 に答える 3

5

事実上、JavaSQLパーサーはhstoreに準拠していないようです。

ただし、構文c ? 'foo'はと同等であるためexist(c, 'foo')、この問題を簡単に回避できます。次のページを見て、hstoreの冗長演算子が何であるかを確認してください。

Postgreshstoreのドキュメント

于 2012-08-14T18:20:48.903 に答える
0

PreparedStatement を使用して複数のキーと値のペアを追加する場合は、次のようにします。

PreparedStatement ps = c.prepareStatement(
                     "insert into xyz(id, data) values(?, hstore(?, ?))");

ps.setLong(1, 23456L);
ps.setArray(2, c.createArrayOf("text", new String[]{"name", "city"}));
ps.setArray(3, c.createArrayOf("text", new String[]{"Duke", "Valley"}));

これにより、次が挿入されます。23456, 'name=>Duke, city=>Valley'

于 2013-02-06T00:06:23.890 に答える