java - MySQL JDBC 计算行数失败

标签 java mysql jdbc

我的这个选择每次在工作台中运行时都有效,但有时会因 jdbc 上的相同参数而失败。问题是,有时,通过 JDBC,“pos”值返回 null。我认为,由于某种原因,@p 未启动,但不知道如何修复。

SELECT t1.wId, t1.twId, t1.name, t1.timeout, t1.pos
FROM (
SELECT w.id AS wId, tw2.id AS twId, w.name AS name, tw2.timeout AS             timeout, @p:=@p+1 AS pos
FROM timeout_workqueue tw1
INNER JOIN timeout_workqueue tw2
ON tw1.workqueue_id = tw2.workqueue_id
INNER JOIN workqueue w
ON tw1.workqueue_id = w.id
WHERE tw1.id = ?
ORDER BY tw2.id) t1, (SELECT @p:=1) c
WHERE t1.twId = ?;

整个Java代码是:

public TimeoutWorkqueueView getTimeoutWorkqueueView(Integer id) {

    String sql = "SELECT t1.wId, t1.twId, t1.name, t1.timeout, t1.pos"
            + " FROM ("
            + " SELECT w.id AS wId, tw2.id AS twId, w.name AS name, tw2.timeout AS timeout, @p:=@p+1 AS pos"
            + " FROM timeout_workqueue tw1"
            + " INNER JOIN timeout_workqueue tw2"
            + " ON tw1.workqueue_id = tw2.workqueue_id"
            + " INNER JOIN workqueue w"
            + " ON tw1.workqueue_id = w.id"
            + " WHERE tw1.id = ?"
            + " ORDER BY tw2.id) t1, (SELECT @p:=1) c"
            + " WHERE t1.twId = ?";

    return (TimeoutWorkqueueView) getJdbcTemplate().queryForObject(sql, new BeanPropertyRowMapper(TimeoutWorkqueueView.class), id, id);

}

最佳答案

好的,我在这里看到的问题(请验证)是您认为您正在运行参数设置为 1 的查询。

但是,如果您设置 @p = 1 -> 此 @p:=@p+1 将不再计算为 1。

还假设您有 20 行,您运行此查询 20 次,但在最后一次运行时它将返回 null,因为 pos 将为 21 而该查询不存在。

关于java - MySQL JDBC 计算行数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37668529/

相关文章:

java - Android - com.google.android.youtube.player 包不存在

java - 使用签名公钥 RSA java 验证数据

MySQL - 如何按值分组并显示在同一行的不同列中

java - 找不到 jdbc 驱动程序?

java - 处理结果集中的空值

java - 我们可以通过哪些不同的方式打破 Java 中的单例模式

java - 如何从 Java 等非 python 语言调用 celery 任务延迟函数?

c# - c#/.net 中是否有与 MySQL show columns 语句等效的语句?

mysql - 比较从最早的列开始的列值,直到它们的总和等于一个数字

java - 在 Java 电子表格应用程序中存储数据的最佳方法