有没有办法使用 PreparedStatement 执行查询(包含内置的 DB 函数)?
示例:插入 foo (location) 值 (pointfromtext('12.56666 13.67777',4130)) 这里 pointfromtext 是一个内置函数。
当然,这应该有效。
如果不是,您的数据库系统是什么,您可以从 SQL 命令行运行完全相同的命令吗?
据我所见,pointfromtext 函数的第一个参数是一个字符串,第二个参数是一个数字。因此,请尝试以下操作:
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();
问号没有被正确评估,因为它们位于简单的引号之间。删除它们,它应该工作,
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();
您是否尝试在preparedStatement 中不设置双打?只是为了测试,您应该尝试将此参数直接插入到字符串中,例如:
String sql = "insert into map_address (location) values(pointfromtext('POINT(" + "12.56565665" + " " + "12.57565757" + ")',4130))"
PreparedStatement preparedStatement = getConnection().prepareStatement(sql);
然后尝试执行更新。
也许您发现 Postgresql JDBC 驱动程序存在问题,而不是 JDBC 本身。通常,您想要实现的目标与 JDBC 一起使用。