我的这个选择每次在工作台中运行时都有效,但有时会因 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/