[英]How do I query subset of columns from PostGIS using MyBatis?
我正在尝试使用MyBatis从PostGIS数据库查询数据,而忽略了地理空间数据。 我在数据库中有下表:
CREATE TABLE salesgeometry
(
id bigint NOT NULL,
label character varying(255),
type character varying(255),
geom geometry,
CONSTRAINT salesgeometry_pkey PRIMARY KEY (id ),
CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 4326)
)
我正在尝试使用以下注释将其与MyBatis映射:
@Select("SELECT id, type, label FROM salesgeometry WHERE ST_Within(" +
"ST_GeomFromText('POINT(#{longitude} #{latitude})', 4326), geom) " +
"AND type = #{type}")
Geometry getGeometryAtLocation(
@NotNull @Param("type") String geometryType,
@NotNull @Param("longitude") BigDecimal longitude,
@NotNull @Param("latitude") BigDecimal latitude
);
目标类具有如下字段:
public class Geometry {
private long id;
private String type;
private String label;
...
}
不幸的是,这不起作用,相反,我得到一个
org.postgresql.util.PSQLException: The column index is out of range: 2, number of columns: 1.
如何仅查询数据库中的列子集?
问题是ST_GeomFromText('POINT(#{longitude} #{latitude})', 4326)
将ST_GeomFromText('POINT(#{longitude} #{latitude})', 4326)
映射到如下所示的准备好的语句: ST_GeomFromText('POINT(? ?)', 4326)
,它不会t实际上包含预期的参数,因为问号在引号内。
解决方案是使用字符串连接(如ST_GeomFromText('POINT(' || #{longitude} || ' ' || #{latitude} || ')', 4326)
或使用字符串替换: ST_GeomFromText('POINT(${longitude} ${latitude})', 4326)
,它直接将值放入SQL语句中,而不使用准备好的语句的参数。
以下映射有效(注意经度和纬度的两个美元符号):
@Select("SELECT id, type, label FROM salesgeometry WHERE ST_Within(" +
"ST_GeomFromText('POINT(${longitude} ${latitude})', 4326), geom) " +
"AND type = #{type}")
Geometry getGeometryAtLocation(
@NotNull @Param("type") String geometryType,
@NotNull @Param("longitude") BigDecimal longitude,
@NotNull @Param("latitude") BigDecimal latitude
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.