Java PreparedStatement可以';无法在子查询中标识占位符
使用Java PreparedStatement时,不会检测到问号占位符。调用statementName.setLong(1123)时,它会抛出一个错误“列索引超出范围:1,列数:0”。我的例子来自Postgres 8.4,但问题发生在SQL有机会进入SQL server之前 在与一些工作准备好的语句进行比较后,我意识到,断开的语句包含一个子查询,类似于:Java PreparedStatement可以';无法在子查询中标识占位符,java,postgresql,Java,Postgresql,使用Java PreparedStatement时,不会检测到问号占位符。调用statementName.setLong(1123)时,它会抛出一个错误“列索引超出范围:1,列数:0”。我的例子来自Postgres 8.4,但问题发生在SQL有机会进入SQL server之前 在与一些工作准备好的语句进行比较后,我意识到,断开的语句包含一个子查询,类似于: SELECT * FROM ( SELECT DISTINCT (name) id, name FROM M
SELECT * FROM (
SELECT DISTINCT (name)
id,
name
FROM MyTable
WHERE id > ?
ORDER BY name) AS Level1
ORDER BY 1
对我有效的解决方案是将查询转换为CTE(公共表表达式)。修改后的查询如下所示:
WITH Level1 AS (
SELECT DISTINCT (name)
id,
name
FROM MyTable
WHERE id > ?
ORDER BY name)
SELECT *
FROM Level1
ORDER BY 1
在JDBC中,准备语句的参数索引从1开始,而不是从0开始。发布引发异常的java代码块,而不仅仅是查询。查询是可以的,但问题可能在于您编写java代码的方式。参数的索引是基于1的。postgresql-9.1-902.jdbc4.JarOK事情变得更奇怪了。通过剥离所有Eclipse自动插入的转义码,\r\n,我能够在另一个冗长的查询字符串上重现此问题。这也不是空间填充问题,因为用空间替换\r\n并不能解决它。好的,这看起来越来越像一个解析错误。将--\r\n追加到SQL查询的第一行末尾可以解决问题。