mysql workbench和java中的查询结果不同(通过jdbc)

erhoui1w  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(428)

这个问题在这里已经有答案了

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)”部分。
你知道怎么会这样吗?

gopyfrb3

gopyfrb31#

不是每个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不在(”“+idslist+”“)”
其中idslist为“?,?,…”需要 setInt(++columnIndex, ids[i++]) 或立即“1,2,3”。

相关问题