项目场景:
springboot+mysql项目中,调用sql查询用户数量情况,出现异常!
问题描述
使用sql 的count函数,查询用户数量的情况,出现以下错误:
java.lang.ClassCastException:java.lang.Long cannot be cast to java.lang.Integer
原因分析:
明显是格式转换异常:Long不能转换为Integer
项目中,console
函数是查询数据库用户总数以及当天新增用户数:
@Override
public List<Map<String,Integer>> console(){
return userDao.console();
}
UserDao的方法
@Select("SELECT COUNT(ID) data_size,COUNT(TO_DAYS(CREATETIME)=TO_DAYS(NOW()) OR NULL) data_day FROM user")
List<Map<String,Integer>> console();
出错位置 UserServiceImpl的findList方法部分代码:
@Override
public TableData findList(boolean limit, Integer offset, Integer pageNumber) {
......
......
List<Map<String, Integer>> console = console();
Integer total = console.get(0).get("data_size");
// 将集合封装为 bootstrap-table识别的格式
TableData<UserVo> data = new TableData<>();
data.setRows(userVoList);
data.setTotal(total);
return data;
}
解决方案:
探索过程:
起初由于错误提示在Integer total = console.get(0).get("data_size");
这行,所以首先想到console.get(0).get("data_size")
可能是Long类型,所以无法转为Integer!
- 因此,第一次尝试是:将
console.get(0).get("data_size")
转为Integer,所以改为
Integer total = console.get(0).get("data_size").intValue();
结果是继续报错!
- 然后想到是不是因为
console.get(0).get("data_size")
是long,不是Long,不能调用intValue()
,所以想到把它先转为Long,然后调用intValue()
转为Integer:
Integer total = new Long(console.get(0).get("data_size")).intValue();
结果也是继续报错!
-
既然不是这两个问题,那么依然还是ClassCastException这个异常,于是我就注意到了
console()
的返回类型,它是List<Map<String, Integer>>
,也就是说,它执行完console()
方法,里面数据就已经是Integer类型,后面就不应该出现转换异常!难道是它在封装为
List<Map<String, Integer>>
时出错了!!!对,它是从哪来,是UserDao!看看代码:
@Select("SELECT COUNT(ID) data_size,COUNT(TO_DAYS(CREATETIME)=TO_DAYS(NOW()) OR NULL) data_day FROM user")
List<Map<String,Integer>> console();
是不是这块出错?于是我就想到sql语句它查出的结果是什么类型呢?
如果是Long,那么它在封装list时就会出现转换为Integer的异常!
于是,我试着更改list的数据类型:
@Select("SELECT COUNT(ID) data_size,COUNT(TO_DAYS(CREATETIME)=TO_DAYS(NOW()) OR NULL) data_day FROM user")
List<Map<String,Long>> console();
再改动UserServiceImpl处的出错位置:
......
List<Map<String, Long>> console = console();
Integer total = console.get(0).get("data_size").intValue();
......
此次运行结果是正常的!
总结
后来,通过查看sql的count函数,了解并证实了我的想法:
sql语句 count (列名) 返回的并不是int类型,而是long型值!!!