JdbcTemplate执行count(*)查询结果与SQL终端不符,求原因分析
遇到这种代码执行结果和数据库客户端查询结果不一致的情况,大概率是细节上的偏差,我帮你梳理几个最可能的排查方向:
先确认代码执行的SQL和SQL Developer里的完全一致
虽然你贴的代码里SQL拼接看起来没问题,但字符串拼接偶尔会出现空格遗漏的情况(比如不小心写成" FROM mytable "+"WHERE ID = ?",会变成FROM mytableWHERE ID = ?这种无效SQL),或者有没有可能代码里的条件被其他逻辑偷偷修改过?建议开启JdbcTemplate的SQL日志(比如在application.properties里加logging.level.org.springframework.jdbc=DEBUG),看一下实际执行的完整SQL和参数,和你在SQL Developer里跑的做对比。检查参数与数据库字段的类型匹配
比如数据库里的ID字段是VARCHAR类型,但你传入的是Integer类型的150,数据库会做隐式类型转换,可能会意外匹配到其他数据(比如有个ID是'150abc',转成整数后会等于150)。反过来,如果数据库ID是BIGINT类型,虽然Integer转BigInt一般没问题,但也可以确认下字段类型是否匹配。核对两边连接的数据源是否一致
这个是最容易忽略的坑!你代码里配置的数据源,是不是和SQL Developer连接的是同一个数据库?比如代码连的是测试环境的库,而你在SQL Developer里查的是生产库,或者反过来?这种情况太常见了,先确认两边的库、表是同一个。确认传入的参数值确实是150
有没有可能代码里的id变量在传入前被修改了?比如你以为是150,但实际运行时是其他值?建议在执行查询前打印一下id的值,比如System.out.println("当前查询ID:" + id);,确保参数正确。尝试手动处理结果集排查解析问题
虽然queryForObject对count(*)的查询正常应该返回0,但也可以换成手动解析结果集的方式,看看是不是结果解析的问题:Integer count = jdbcTemplate.query(sqlCount, new Object[]{id}, rs -> { if (rs.next()) { return rs.getInt(1); } return 0; });
内容的提问来源于stack exchange,提问作者microwth

