PreparedStatement没有读取PostGIS Geography的所有参数

Ste*_*eph 6 java database postgresql postgis jdbc

我有以下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());
            ...
Run Code Online (Sandbox Code Playgroud)

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

org.postgresql.util.PSQLException: The column index is out of range: 3, number of columns: 2.
Run Code Online (Sandbox Code Playgroud)

我知道它认为我只有2个参数,但你可以看到我打算在那里有10个.我不知道为什么它没有读取其中的任何参数POLYGON.我知道如果我直接在数据库中使用它,这个SQL语句是有效的,但是我不知道我需要改变什么来使它在我的Java代码中工作.有任何想法吗?

mu *_*ort 8

你的问题是:

'POLYGON((? ?, ? ?, ? ?, ? ?))'
Run Code Online (Sandbox Code Playgroud)

是一个SQL字符串文字,恰好包含八个问号.由于这是一个SQL字符串文字,因此其中的任何问号都不会被视为占位符.这将留下两个占位符:VALUES列表最开头的一个占位符和最后一个占位符.

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

VALUES (?, ST_GeographyFromText(?), ?)
Run Code Online (Sandbox Code Playgroud)

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


Luc*_*nti 6

因为mu太短,所以问题是占位符在引号内部不被识别.

如果用Java构建整个字符串是不可能的(例如在我的情况下它太过于干扰)你可以通过将占位符移到文字外部然后使用PgSQL字符串连接运算符来解决问题,如下所示:

ST_GeographyFromText('SRID=4326;POINT(' || ? || ' ' || ? || ')')
Run Code Online (Sandbox Code Playgroud)

在您的情况下,解决方案将是:

ST_GeographyFromText('POLYGON((' || ? || ' ' || ? || ', ' || ? || ' ' || ? ||
    ', ' || ? || ' ' || ? || ', ' || ? || '' || ? || '))')
Run Code Online (Sandbox Code Playgroud)

不太可读,但它的工作原理......