参数化 postgis 几何查询

Parameterizing postgis geometry query

我正在尝试查询一组多边形(在运行时传入)是否与存储在数据库中的“enclosing_polygons”字段中的一组多边形相交,这是一个 MultiPolygonField。

下面是一个查询示例:

select * from my_table where field1 = any (?) and field2 = any (?) and (
ST_Intersects(ST_GeometryFromText('POLYGON((? ?, ? ?, ? ?, ? ?, ? ?))'), enclosing_polygons) or
ST_Intersects(ST_GeometryFromText('POLYGON((? ?, ? ?, ? ?, ? ?, ? ?))'), enclosing_polygons)) 
and detection_type = 0 order by confidence desc limit 2000

该查询使用硬编码值可以正常工作,但是当我尝试对其进行参数化时,Postgres 似乎无法识别 ?当我尝试填充时,多边形点的占位符作为参数。

当我设置前两个参数(对于 field1 和 field2)时,这些 JDBC 语句成功:

statement.setArray(1, array1)
statement.setArray(2, array2)

但是,如果我尝试设置前两个以外的任何参数,它们就会失败。本声明:

statement.setDouble(3, point1x)

失败并出现以下错误:

The column index is out of range: 3, number of columns: 2.

为什么 Postgres 不能将 POLYGON 构造函数中的这些 ?s 识别为查询参数?

我怎样才能使这个工作?

由您的驱动程序实现 ? 占位符,PostgreSQL 永远看不到它们。在您的驱动程序中,就像在几乎所有驱动程序中一样,出现在单引号内的问号只是文字问号,而不是占位符。

您可能需要自己构造 POLYGON((...)) 字符串,然后将整个字符串作为单个占位符传递到查询中。所以这部分查询看起来像 ST_Intersects(ST_GeometryFromText(?), enclosing_polygons)

有替代方案,但它们大多只是转移问题而不是直接解决它。如果您真的只想使用普通问号并将每个问号绑定到一个数字,您可以将 ST_GeometryFromText 函数替换为类似以下内容的函数:

st_makepolygon(st_makeline(array[st_makepoint(?,?),st_makepoint(?,?),st_makepoint(?,?),st_makepoint(?,?),st_makepoint(?,?)]))