我让这个select在工作台中运行,但有时会因为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);
}发布于 2016-06-07 08:40:21
好的,所以我在这里看到的问题(请验证)是您认为您一开始就将参数设置为1来运行查询。
但是,如果您设置@p =1 ->,则此@p:=@p+1将不再计算为1。
同样假设您有20行,您运行此查询20次,但在最后一次运行时,它将返回null,因为pos将是21,而这个值并不存在。
https://stackoverflow.com/questions/37668529
复制相似问题