这个问题在这里已经有答案了:
preparedstatement,in子句中包含参数列表[副本](15个答案)
两年前关门了。
我使用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的配方。它以字符串的形式出现在preparedstatement中。
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。
它没有给出任何错误,但似乎完全忽略了“和不在(1,2,3)”部分。
你知道怎么会这样吗?
1条答案
按热度按时间gopyfrb31#
不是每个java数据库驱动程序都能做到这一点,但通常可以使用java.sql.array:
已经评论过,setstring将
'1, 2, 3'
.数组必须知道每个元素的sql类型,一般情况下,会传递一个对象数组。
@markrotteveel告知这在mysql中不起作用。
然后,必须动态创建sql字符串的该部分。
“id不在(”“+idslist+”“)”
其中idslist为“?,?,…”需要
setInt(++columnIndex, ids[i++])
或立即“1,2,3”。