【问题标题】:Cannot escape parameters inside single quotes on a JDBC PreparedStatement无法在 JDBC PreparedStatement 上的单引号内转义参数
【发布时间】:2014-07-30 20:51:01
【问题描述】:

我想通过 JDBC 进行这样的查询(注意它包含一些 postgis 函数):

SELECT id, name, ST_Y(location::geometry) as latitude, ST_X(location::geometry) as longitude, category_group, category 
FROM pois 
WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT(-5.8340534 43.3581991)'), 1000000);

所以我将查询参数化为:

SELECT id, name, ST_Y(location::geometry) as latitude, ST_X(location::geometry) as longitude, category_group, category 
FROM pois 
WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT(? ?)'), ?);

问题是执行preparedStament时找不到前2个参数,因为它们在单引号内,所以报错。

我也尝试用 \' 转义单引号但没有成功:

SELECT id, name, ST_Y(location::geometry) as latitude, ST_X(location::geometry) as longitude, category_group, category 
FROM pois 
WHERE ST_DWithin(location, ST_GeographyFromText(\'SRID=4326;POINT(? ?)\'), ?);

目前,作为一种解决方法,我没有绑定参数,只是将查询字符串附加到它们上,但这很容易受到 SQL 注入的影响,所以我只想知道是否有任何方法可以转义该语句参数绑定工作。

【问题讨论】:

  • 它给出了什么错误?
  • @NinadPingale 原因:org.postgresql.util.PSQLException:列索引超出范围:2,列数:1。在 org.postgresql.core.v3.SimpleParameterList.bind( SimpleParameterList.java:51)
  • 将其添加到您的问题中,不要在 cmets 中添加额外信息

标签: java sql jdbc binding


【解决方案1】:

问自己,我正在使用字符串 concat:

"SELECT id, name, ST_Y(location::geometry) as latitude, ST_X(location::geometry) as longitude, category_group, category 
FROM pois 
WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT(' || ? || ' ' || ? || ')'), ?);"

【讨论】:

  • 这是唯一真正的解决方案,您在问题中描述的行为是预期的。
【解决方案2】:

作为一个幼稚的答案....

您可以在查询之前分配参数,然后将其与查询连接 例如:

Scanner scan = new Scanner(System.in); //don't forget to import java.util package
String par1 = scan.nextLine();
String par2 = scan.nextLine();

稍后

String query = "SELECT id, name, ST_Y(location::geometry) as latitude, " + 
    "ST_X(location::geometry) as longitude, category_group, category " +
    "FROM pois " +
    "WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT("+par1+" "+par2+")'), ?)"; 

现在将此查询传递给查询创建语句

【讨论】:

  • 这很容易受到 SQL 注入的影响,所以这不是一个好方法。
猜你喜欢
  • 2017-11-21
  • 2017-04-15
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2015-11-06
  • 2016-12-17
  • 2016-04-29
  • 2012-05-07
相关资源
最近更新 更多