org.postgresql.util.PSQLException:错误:语法错误在“$ 1”或附近

时间:2015-10-10 20:32:19

标签: java postgresql jdbc

我得到这个PSQLException:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
  Position: 37

当我运行以下代码时:

ps = connection.prepareStatement("SELECT current_timestamp + INTERVAL ?;");
ps.setString(1, "30 minutes");
System.out.println(ps);
rs = ps.executeQuery();

但是,println函数在控制台中显示:

SELECT current_timestamp + INTERVAL '30 minutes'

任何人都知道什么是错的?控制台中的查询在pgAdmin中正常运行,因此我知道这不是语法错误。

2 个答案:

答案 0 :(得分:18)

虽然语法INTERVAL '30 minutes'在您直接在控制台中编写SQL时有效,但它实际上被认为是区间文字,并且在单词后面的字符串不起作用INTERVAL不是文字字符串。

PostgreSQL中的预处理语句使用PREPARE在服务器端实现,每个?被视为服务器上的实际变量。这也是为什么它抱怨$1,尽管你从未在你的陈述中写过$

因此,文字语法不适用于预准备语句。

不要让准备好的语句的字符串表示(println的结果)让您感到困惑 - 这不是服务器看到的内容。服务器在那里看到一个变量。

因此,您需要使用带有字符串的语法(可以是变量或文字)并将其转换为间隔。例如?::INTERVALCAST(? AS INTERVAL)

因此是一个错误。

答案 1 :(得分:-1)

我相信这是一个Postgres错误,所以我想到了一个肮脏的黑客来解决这个问题......

ps = connection.prepareStatement("SELECT current_timestamp + INTERVAL ?;");
ps.setString(1, "30 minutes");
ps = connection.prepareStatement(ps.toString());
rs = ps.executeQuery();

我想知道这是否会得到解决?