我正在使用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)”部分。
知道这怎么发生吗?
答案 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”。