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

时间:2013-04-03 23:54:06

标签: java postgresql

使用Java PreparedStatement时,未检测到问号占位符。当调用 statementName .setLong(1,123)时,它会抛出错误“列索引超出范围:1,列数: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

2 个答案:

答案 0 :(得分:1)

对我有用的解决方案是将查询转换为CTE(公用表表达式)。修订后的查询如下所示:

WITH Level1 AS ( 
  SELECT DISTINCT (name) 
    id, 
    name 
  FROM MyTable
  WHERE id > ?
  ORDER BY name)

SELECT * 
FROM Level1
ORDER BY 1

答案 1 :(得分:0)

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