【问题标题】:PreparedStatement is not reading all my parameters for PostGIS GeographyPreparedStatement 没有读取我的所有 PostGIS Geography 参数
【发布时间】:2011-09-19 22:26:18
【问题描述】:

我有以下 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 代码中工作。有什么想法吗?

【问题讨论】:

    标签: java database postgresql jdbc postgis


    【解决方案1】:

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

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

    ST_GeographyFromText('SRID=4326;POINT(' || ? || ' ' || ? || ')')
    

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

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

    可读性不是很好,但它可以工作......

    【讨论】:

      【解决方案2】:

      你的问题是这样的:

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

      是一个恰好包含八个问号的 SQL 字符串文字。由于这是一个 SQL 字符串文字,因此其中没有一个问号被视为占位符。这样就剩下两个占位符了:VALUES 列表最开始的一个和最后一个。

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

      VALUES (?, ST_GeographyFromText(?), ?)
      

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

      【讨论】:

      • 啊,我明白了。感谢您提供非常清晰的解释。我很感激。
      • 由于我需要 ST_DISTANCE 并且上述方法不起作用(错误:函数 st_distance(character varying) 不存在)我做了这个答案中通常建议的操作,我像这样操作字符串:字符串sqlFetchMgq = select ... ST_DISTANCE(coordinates, 'SRID=4326;POINT(%s %s)') 然后用 sqlFetchMgq = String.format(sqlFetchMgq, longitude, latitude);我明白了!
      猜你喜欢
      • 2018-05-05
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多