java - PreparedStatement 没有读取我的 PostGIS Geography 的所有参数

标签 java database postgresql jdbc postgis

我有以下 JDBC 代码。请注意,我正在尝试使用 PostGIS 地理:

PreparedStatement stmt = db.prepareStatement("INSERT INTO " +
                    "source_imagery (image_path, boundary, image_time)" +
                    " VALUES (?, ST_GeographyFromText('POLYGON((" +
                    "? ?, ? ?, ? ?, ? ?))'), ?)");

            stmt.setString(1, file.getAbsolutePath());
            stmt.setDouble(2, bounds.getY());
            stmt.setDouble(3, bounds.getX());
            ...

我在最后一行代码中遇到以下异常:

org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2.

我知道它认为我只有 2 个参数,但你可以看到我打算有 10 个。我不确定为什么它不读取 POLYGON 中的任何参数>。我知道如果我直接在数据库中使用此 SQL 语句,它会起作用,但我不确定必须更改什么才能使其在我的 Java 代码中起作用。有什么想法吗?

最佳答案

你的问题是:

'POLYGON((? ?, ? ?, ? ?, ? ?))'

是一个 SQL 字符串文字,恰好包含八个问号。由于这是一个 SQL 字符串文字,因此其中的所有问号都不会被视为占位符。这给您留下了两个占位符:一个位于 VALUES 列表的最开头,一个位于最后。

您必须以其他方式构建多边形。可能有比 ST_GeographyFromText 更好的方法,但是,唉,我不知道它是什么,而且我没有在任何地方设置 PostGIS。如有必要,您可以使用标准字符串整理手动构建 POLYGON 字符串,然后为其使用占位符:

VALUES (?, ST_GeographyFromText(?), ?)

ST_GeographyFromText 中的占位符将被视为占位符,因为它不在字符串文字中,您可以使用 stmt.setString 为其赋值。

关于java - PreparedStatement 没有读取我的 PostGIS Geography 的所有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432700/

相关文章:

Jenkins 上的 Java 本地化测试失败

java - JPA,独立应用程序和实体管理器

sql - 如何在Postgres中实现列值变化约束

java - 从 date 到 long 的转换在 java 和 postgresql 中是不一样的

php - 使用 PostgreSQL 和 PHP 获取查询结果

java - 添加dss字典

java - 我可以创建一个作为泛型类型参数的成员变量吗?

ruby - 为什么 datamapper 不更新记录/检测脏度?

sql - 使用内存数据库从多个数据库查询

sql - 使用 SQL 将文本文件导入通用数据库