在MySQL Workbench和Java中(通过JDBC),查询结果有所不同

时间:2018-08-30 12:31:11

标签: java mysql jdbc

我正在使用MySQL数据库,Java应用程序和JDBC进行通信。

此处的目标是选择符合某些条件的“食谱”,这是通过不基于ID选择(删除)某些食谱来实现的

我在SQL方面不是特别强,但是下面的代码可以在MySQL Workbench中使用时按预期工作:

SELECT id FROM recipes WHERE(global_access = 1 OR owner = 1)
AND id NOT IN (1,2,3) 
AND id NOT IN ( 
# Remove for brevity. Returns ID's to be excluded. 
) );

具体来说,该部分:

AND NOT IN (1,2,3)

应确保不会返回ID为1,2或3的配方。它是Java中的PreparedStatement中的String形式。

String sql = "SELECT id FROM recipes WHERE(global_access = 1 OR owner = ?) 
AND id NOT IN ( ? ) " .... (rest removed)

当我在MySQL工作台中运行此SQL时,它可以正确过滤出配方(1,2,3)。但是,当我从Java运行它时,不是。

我已经检查过传递的参数确实是1,2,3。

它没有给出任何错误,但是似乎完全忽略了“ AND NOT IN(1,2,3)”部分。

知道这怎么发生吗?

1 个答案:

答案 0 :(得分:1)

不是每个Java数据库驱动程序都能做到,但是通常一个人都可以使用java.sql.Array:

AND id NOT IN(?)

Array a = connection.createArrayOf("INT", new Object[] {1, 2, 3});

preparedStatement.setArray(..., a);

已经评论过,该setString将产生'1, 2, 3'

数组必须知道每个元素的SQL类型,并在常规用法中传递一个对象数组。


@MarkRotteveel告知这在MySQL中不起作用。

然后必须动态创建部分SQL字符串。

“ id NOT IN(” + idsList +“)”

idsList的位置是“?,?,...?”需要setInt(++columnIndex, ids[i++])或立即输入“ 1、2、3”。