【问题标题】:Use java prepared statement with LIKE使用带有 LIKE 的 java 准备好的语句
【发布时间】:2019-07-26 01:01:01
【问题描述】:

我想使用带有 LIKE 关键字的 java 准备语句。 我正在尝试匹配日期字符串。 这是我的代码。

String summaryChooser = "SELECT * FROM PRODUCT p, CODE_COVERAGE_SUMMARY s WHERE "
                    + " p.product_id = s.product_id AND p.product_id = ? AND s.date LIKE ? "
                    + " ORDER BY s.date DESC LIMIT 1 ";
ps = dbConnection.prepareStatement(summaryChooser);
ps.setInt(1, productsResult.getInt("product_id"));
ps.setString(2,  "%" + date + "%");

它给出了以下异常。

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以获取在 '? 附近使用的正确语法。 AND s.date LIKE ? ORDER BY s.date DESC LIMIT 1' 在第 1 行

【问题讨论】:

  • 对 DATE 列使用 LIKE 有点不寻常? s.date 是什么数据类型
  • 我敢打赌,您的下一个陈述是 ps.executeQuery(summaryChooser),这是错误的。它应该只是ps.executeQuery()。通过将 SQL 文本传递给 Statement.executeQuery(String sql) 方法,当您应该调用 PreparedStatement.executeQuery() 方法时,JDBC 驱动程序会忽略“准备好的”部分并尝试按原样直接执行 SQL。这是使用PreparedStatement时的常见错误。
  • 离题但最好使用JOIN而不是使用,的隐式连接
  • @MarkRotteveel 会很好,但不是真的需要,因为错误来自 MySQL 服务器,并且错误包括 ? 标记,并且发生的唯一方法是 SQL 不是没有“准备好”,这就是为什么我愿意赌上我的“猜测”。 ;-)
  • @Andreas 你可能是对的,在这种情况下,这将是一个很好的副本:MySQLSyntaxErrorException near “?” when trying to execute PreparedStatement

标签: java mysql prepared-statement sql-like


【解决方案1】:

我可以这样做。

ps.setString(2, date + "%");

谢谢大家:)

【讨论】:

  • 为什么要去掉value的前导通配符,修复SQL语句的语法错误
  • 在我的情况下,我不会在日期之前考虑任何事情。
【解决方案2】:

替换:

ps.setString(2,  "%" + date + "%");

与:

ps.setString(2,  "'" + date + "'");

【讨论】:

  • 为什么会有帮助? ' 不是 LIKE 通配符。此外,列的 value 不太可能以撇号开头和结尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
相关资源
最近更新 更多