3

使用 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
4

2 回答 2

1

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

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

SELECT * 
FROM Level1
ORDER BY 1
于 2013-04-03T23:54:06.353 回答
0

在 JDBC 中,prepared statements 的参数索引从 1 而不是 0 开始。

于 2013-04-03T23:58:37.887 回答