【问题标题】:Query results differ between MySQL Workbench and in Java (through JDBC) [duplicate]MySQL Workbench 和 Java 中的查询结果不同(通过 JDBC)[重复]
【发布时间】:2019-02-05 09:43:57
【问题描述】:

我正在使用 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 中以 Java 字符串的形式出现。

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,2,3)吗?
  • 我会编辑帖子,这里不可读
  • in参数是否设置为整数数组?
  • 不,它是“setString”,字符串由 ID 组成。我想我现在知道为什么了。 setString 将自动添加 ' ,因为它是一个字符串?
  • 是的,您需要将其设置为列表/数组。对于字符串,它将被视为单个值“1,2,3”。

标签: java mysql jdbc


【解决方案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'

Array 必须知道每个元素的 SQL 类型,并且对于一般用途,传递一个 Object 数组。


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

那么这部分 SQL 字符串必须是动态创建的。

" id NOT IN(" + idsList + ")"

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

【讨论】:

  • IIRC 这不适用于 MySQL。
猜你喜欢
  • 2014-09-12
  • 2014-09-04
  • 2015-02-09
  • 1970-01-01
  • 2017-01-16
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多