PreparedStatement を使用して (組み込みの DB 関数を含む) クエリを実行する方法はありますか?
例: insert into foo (location) values (pointfromtext('12.56666 13.67777',4130)) ここで、pointfromtext は組み込み関数です。
私が見たところ、pointfromtext 関数の最初のパラメーターは文字列で、2 番目のパラメーターは数値です。したがって、次のことを試してください。
PreparedStatement preparedStatement = getConnection().prepareStatement("insert into map_address (location) values(pointfromtext('POINT(' || ? || ' ' || ? || ')',4130))");
preparedStatement.setString(1, "12.56565665");
preparedStatement.setString(2, "12.57565757");
preparedStatement.executeUpdate();
確かに、それはうまくいくはずです。
そうでない場合、データベース システムは何ですか? SQL コマンド ラインからまったく同じコマンドを実行できますか?
疑問符は単純な引用符で囲まれているため、正しく評価されていません。それらを削除すると、動作するはずです。
PreparedStatement オブジェクトのスコープは、正確にクエリを実行することです。クエリに組み込みの DB 関数が含まれている場合は問題ありません。同じクエリが PreparedStatement の外部で機能する場合、すべてが機能するはずです。
Thilo が言ったように、クエリ形式の SQL コマンド ラインをテストするか、通常使用する SQL グラフィカル ツールを使用してテストします。
このコードの後に connection.commit()を置きましたか?
コードは次のようになります。
PreparedStatement bar = connection.prepareStatement("insert into foo (location) values (pointfromtext('? ?',4130)))");
bar.setDouble(1, 13.67777);
bar.setDouble(2, 13.67777);
bar.executeUpdate();
connection.commit();
おそらく、JDBC 自体の問題ではなく、Postgresql JDBC ドライバーの問題を発見したことでしょう。一般に、達成したいことは JDBC で機能します。
preparaedStatement に double を設定しないようにしましたか? テストのためだけに、次のように、このパラメーターを文字列に直接挿入してみてください。
String sql = "insert into map_address (location) values(pointfromtext('POINT(" + "12.56565665" + " " + "12.57565757" + ")',4130))"
PreparedStatement preparedStatement = getConnection().prepareStatement(sql);
その後、アップデートを実行してみてください。