繁体   English   中英

JDBC查询抛出语法错误

[英]JDBC query throwing syntax error

基本上,这应该做的是运行一个查询,从一列中读取所有值,然后根据这些值运行其他一些查询。 它将值转换为整数的SQL数组,并将其作为参数传递给其他查询的语句,但是当它们执行时,它将引发“在“ $ 1”或附近的语法错误”位置:87”

查询示例:

"SELECT foo.id, bar.* "
+ "FROM foo, bar y "
+ "WHERE foo.baz = bar.baz and foo.id IN ? "
+ "GROUP BY foo.id";

和参数设置位(结果是列数据的数组列表):

    Integer[] data = result.toArray(new Integer[result.size()]);
    Array array = connection.createArrayOf("INTEGER", data);

    statement.clearParameters();
    statement.setArray(1, array);

(代码是通用的,因为这是用于家庭作业)

IN运算符要求使用放在括号之间的表达式列表: in (1,2,3) 一个? 占位符仅可用于单个标量值(数字,字符串)。

如果要将ID列表作为数组传递,则需要更改SQL,以便占位符“接受”数组:

SELECT foo.id, bar.*
FROM foo
  JOIN bar y ON foo.baz = bar.baz
WHERE and foo.id = ANY (?) 
GROUP BY foo.id

请注意,我还将WHERE子句中的旧式隐式JOIN更改为现代的显式JOIN (但这与您的问题无关紧要)。

使用上述语法,您可以传递带有ID列表的数组。

您将得到的下一个问题是Postgres中"INTEGER"不是有效的数据类型。 类型名称按“原样”传递,而数据类型在Postgres中使用小写字母。 因此,您需要使用:

Array array = connection.createArrayOf("integer", data);

您为什么不一口气做到这一点?

SELECT foo.id, bar.*
FROM foo
  JOIN bar y ON foo.baz = bar.baz
WHERE and foo.id IN (SELECT some_column FROM ...) --<< this is your "first query"
GROUP BY foo.id

这几乎总是比运行两个单独的语句更好。


无关:

group by foo.id似乎是不必要的,因为您不使用任何聚合函数。 除非foo.idfoo表的主键,否则它将无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM