Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PreparedStatement可以';无法在子查询中标识占位符_Java_Postgresql - Fatal编程技术网

Java PreparedStatement可以';无法在子查询中标识占位符

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

使用Java PreparedStatement时,不会检测到问号占位符。调用statementName.setLong(1123)时,它会抛出一个错误“列索引超出范围:1,列数:0”。我的例子来自Postgres 8.4,但问题发生在SQL有机会进入SQL server之前

在与一些工作准备好的语句进行比较后,我意识到,断开的语句包含一个子查询,类似于:

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查询的第一行末尾可以解决问题。