• MySQL分段统计SQL写法 与 Mybatis 异常 java.math.BigDecimal cannot be cast to java.lang.Integer


    mysql> select
        -> sum(case when score<60 then 1 else 0 end) as '<60',
        -> sum(case when score>=60 and score<=69 then 1 else 0 end) as '60~69',
        -> sum(case when score>=70 and score<=79 then 1 else 0 end) as '70~79',
        -> sum(case when score>=80 and score<=89 then 1 else 0 end) as '80~89',
        -> sum(case when score>-90 then 1 else 0 end) as '>=90'
        -> from student_course
        -> ;
    +------+-------+-------+-------+------+
    | <60  | 60~69 | 70~79 | 80~89 | >=90 |
    +------+-------+-------+-------+------+
    |    2 |     1 |     1 |     1 |   10 |
    +------+-------+-------+-------+------+

     采用mybatis时,xml文件配置如下处理:

      <select id="getScoreStatistics" resultType="map">
          select 
            sum(case when score &lt; 60 then 1 else 0 end) as '&lt;60',
            sum(case when score &gt;= 60 and score &lt;= 69 then 1 else 0 end) as '60~69',
            sum(case when score &gt;= 70 and score &lt;= 79 then 1 else 0 end) as '70~79',
            sum(case when score &gt;= 80 and score &lt;= 89 then 1 else 0 end) as '80~89',
            sum(case when score &gt;= 90 then 1 else 0 end) as '&gt;=90'
        from student_course
      </select>

    mapper接口:

    Map<String, Object> getScoreStatistics();

    注意,这里如果使用 Map<String, Integer> 作为返回值,会报错:

    java.math.BigDecimal cannot be cast to java.lang.Integer

    原因是,sum() 的结果是作为 java.math.BigDecimal 来处理的, 而他不能直接转换成 java.lang.Integer,所以报错。

    正确的处理方法是,返回 Map<String, Object>,然后

    {"<60":2,"60~69":1,"70~79":1,"80~89":1,">=90":5}

    int count1 = Integer.parseInt(resultMap.get("<60").toString());

    通过Object类型的 toString()方法,然后 Integer.parseInt() 这里才能得到正确的结果。

    当然我们也可以直接返回:Map<String, BigDecimal> getScoreStatistics();

    然后通过BigDecimal.intValue() 来获得我们需要的值:

        Map<String, BigDecimal> getScoreStatistics();
    Map<String, BigDecimal> resultMap = this.studentCourseMapper.getScoreStatistics();
    int
    count = resultMap.get("<60").intValue();

     总结

    1)sql中的 sum() 返回返回值在mybatis中是作为BigDecimal来返回的,所以我们有两种方法来处理:

       1> 返回 Object 值,然后通过 Integer.parseInt(obj.toString()); 来得到int值;

       2> 返回 BigDecimal 值,然后通过 BigDecimal.intValue()得到需要的值,应该说我们推荐使用第二种方法。

    2)mysql分段统计方法:sum(case when score<60 then 1 else 0 end)

  • 相关阅读:
    Qt 的插件制作遇到的问题
    Qt实现原生Flow实现不了的Item错误排列效果,类似淘宝商品展示
    通过pro文件使Qt的build目录更清爽
    No rule to make target
    Qtcreator中printf()/fprintf()不显示问题处理方法
    QtCreator集成的MSVC套件有问题
    启动程序失败,路径或者权限错误
    图数据库 Nebula Graph 的数据模型和系统架构设计
    NLP(十六)轻松上手文本分类
    NLP(十五)让模型来告诉你文本中的时间
  • 原文地址:https://www.cnblogs.com/digdeep/p/4600907.html
Copyright © 2020-2023  润新知