Java PreparedStatement无法识别子查询中的占位符。

3
使用Java的PreparedStatement时,无法检测到问号占位符。当调用statementName.setLong(1, 123)时,它会抛出错误"The column index is out of range: 1, number of columns: 0"。我的示例来自Postgres 8.4,但该问题在SQL到达SQL服务器之前就已经出现了。
与一些正常工作的预处理语句进行比较后,我发现有问题的语句包含一个类似于子查询的内容。
SELECT * FROM ( 
  SELECT DISTINCT (name) 
    id, 
    name 
  FROM MyTable
  WHERE id > ?
  ORDER BY name) AS Level1
ORDER BY 1

请发布抛出异常的Java代码块,而不仅仅是查询。查询没问题,但问题可能在您编写Java代码的方式上。 - Barranka
参数的索引是从1开始的。 - David
postgresql-9.1-902.jdbc4.jar - scottwed
2个回答

1
我找到的解决方案是将查询转换为CTE(公共表达式)。修改后的查询如下:
WITH Level1 AS ( 
  SELECT DISTINCT (name) 
    id, 
    name 
  FROM MyTable
  WHERE id > ?
  ORDER BY name)

SELECT * 
FROM Level1
ORDER BY 1

好吧,事情变得更加奇怪了。我尝试剥离所有Eclipse自动插入的\r\n转义代码后,在另一个冗长的查询字符串上重现了这个问题。这也不是空格填充问题,因为用空格替换\r\n并不能解决它。 - scottwed
好的,这看起来越来越像是一个解析错误。在SQL查询的第一行末尾添加--\r\n可以解决问题。 - scottwed

0
在JDBC中,预处理语句的参数索引从1开始而不是0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接