【mysql】sql语句 count (列名) 返回的并不是int类型,而是long型值 [ClassCastException:Long cannot be cast to integer]

项目场景:

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!

  1. 因此,第一次尝试是:将console.get(0).get("data_size")转为Integer,所以改为
 Integer total = console.get(0).get("data_size").intValue();

结果是继续报错!

  1. 然后想到是不是因为console.get(0).get("data_size")是long,不是Long,不能调用intValue(),所以想到把它先转为Long,然后调用intValue()转为Integer:
  Integer total = new Long(console.get(0).get("data_size")).intValue();

结果也是继续报错!

  1. 既然不是这两个问题,那么依然还是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型值!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Itfuture03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值