Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PreparedStatement未读取PostGIS地理信息系统的所有参数_Java_Database_Postgresql_Jdbc_Postgis - Fatal编程技术网

Java PreparedStatement未读取PostGIS地理信息系统的所有参数

Java PreparedStatement未读取PostGIS地理信息系统的所有参数,java,database,postgresql,jdbc,postgis,Java,Database,Postgresql,Jdbc,Postgis,我有以下JDBC代码。请注意,我正在尝试使用PostGIS地理: PreparedStatement stmt = db.prepareStatement("INSERT INTO " + "source_imagery (image_path, boundary, image_time)" + " VALUES (?, ST_GeographyFromText('POLYGON((" +

我有以下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个。我不知道为什么它没有读取
多边形中的任何参数。我知道,如果我直接在数据库中使用SQL语句,它是可以工作的,但我不确定要在Java代码中使用它,我必须做哪些更改。有什么想法吗?

你的问题是:

'POLYGON((? ?, ? ?, ? ?, ? ?))'
是一个恰好包含八个问号的SQL字符串文本。因为这是一个SQL字符串文字,所以它里面的问号都不被认为是占位符。这就给您留下了两个占位符:一个在
值列表的最开头,另一个在最末尾

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

VALUES (?, ST_GeographyFromText(?), ?)
ST_GeographyFromText
中的占位符将被视为占位符,因为它不在字符串文字中,您可以使用
stmt.setString
给它一个值。

由于mu太短,所以正确地说,问题是占位符在引号内无法识别

如果无法在Java中构建整个字符串(例如,在我的例子中,它太侵入性了),您可以通过将占位符移到文本之外,然后使用PgSQL字符串连接运算符来解决此问题,如下所示:

ST_GeographyFromText('SRID=4326;POINT(' || ? || ' ' || ? || ')')
在您的情况下,解决方案是:

ST_GeographyFromText('POLYGON((' || ? || ' ' || ? || ', ' || ? || ' ' || ? ||
    ', ' || ? || ' ' || ? || ', ' || ? || '' || ? || '))')

不太可读,但很有效…

啊,我理解。谢谢你给我一个非常清楚的解释。我很感激。