使用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
答案 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。