Java + JDBC : Prepared statement failing

标签 java mysql sql jdbc

我正在尝试做出准备好的声明,驱动程序正在按照我假设的方式工作,但唯一的问题是我的查询不再有效。

我正在尝试编写此查询:

SELECT ip_address
FROM log_activity
WHERE created_at
  BETWEEN "2017-01-01 00:00:00"
  AND DATE_ADD("2017-01-01 00:00:00", INTERVAL 1 HOUR)
GROUP BY ip_address
HAVING COUNT(*) > 200;

但是在插入准备好的语句的参数后,结果如下:

SELECT ip_address
FROM log_activity
WHERE created_at
  BETWEEN '\'2017-01-01 00:00:00\''
  AND DATE_ADD('\'2017-01-01 00:00:00\'', INTERVAL 1 'hour')
GROUP BY ip_address
HAVING COUNT(*) > 200;

这不再是有效的 SQL。那么如何从参数中删除这些引号或者解决这个问题的好方法是什么?

...

String startDateArg = "'" + args[0].split("=", 2)[1].replace(".", " ") + "'";
String durationArg = args[1].split("=", 2)[1];
int thresholdArg = Integer.parseInt(args[2].split("=", 2)[1]);

String duration = durationArg.equals("hourly") ? "hour" : durationArg.equals("daily") ? "day" : null;

String getUsersOverAPILimitQuery = "" +
    "select ip_address " +
    "from log_activity " +
    "where created_at " +
    "  between ?" +
    "  and date_add(?, interval 1 ?) " +
    "group by ip_address " +
    "having count(*) > ?;";
PreparedStatement preparedStatement = con.prepareStatement(getUsersOverAPILimitQuery);
preparedStatement.setString(1, startDateArg);
preparedStatement.setString(2, startDateArg);
preparedStatement.setString(3, duration);
preparedStatement.setInt(4, thresholdArg);

System.out.println(preparedStatement);

ResultSet getUsersOverAPILimit = preparedStatement.executeQuery();

while (getUsersOverAPILimit.next()) {
    String ip_address = getUsersOverAPILimit.getString("ip_address");
    System.out.println(ip_address);
}

...

最佳答案

而不是这个:

String startDateArg = "'" + args[0].split("=", 2)[1].replace(".", " ") + "'";

这样做:

String startDateArg = args[0].split("=", 2)[1].replace(".", " ");

无需添加单引号,preparedstatement 会为您完成此操作。

关于Java + JDBC : Prepared statement failing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677657/

相关文章:

java - 平移/旋转/移动图形对象而不弄乱整个屏幕

java - 如何在 jOOQ 查询中使用 Postgres 的 to_char?

mysql - Yii2 获取列的总和

python - 如何解决 flask 中的坏键错误?

php - 在 Woocommerce 中使用 SQL 从特定产品属性值获取产品 ID

sql - 从 plpgsql 函数返回一个选择

java - Android - 如何判断 db.execSQL 在 onCreate 上是否成功

java - 处理 PrintWriter 无法正常工作

java - 使用 NatTable 实现树

mysql - groupBy ('created_at' ) 在 laravel Eloquent 中使用子查询