MyBatis的SUM映射问题及解决

目录
  • SUM映射问题
    • 原因
    • 解决方式
  • sum 返回映射问题(sum报表统计接口返回)
    • MyBatis sum 返回值映射

SUM映射问题

当我们根据类别进行统计,返回的数据类型为HashMap<String,Object>,获取数值类型,容易报

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

场景如下:

// Mapper层
<select id="selectInfoByTest" resultType="map">
    SELECT SUM(flag) as flags,taskid FROM qcdata GROUP BY taskid
</select>
// 接口
List<HashMap<String, Object>> selectInfoByTest();
 
// 调用代码
List<HashMap<String, Object>> result = qcDao.selectInfoByTest();
int flags=(Integer)result.get(0).get("flags"); // 报错
return JSONResult.ok(flags);

原因

sql中的 sum() 返回返回值在mybatis中是作为BigDecimal来返回的,而不能用Integer来接收

解决方式

可以转换为字符串,然后再转换为int类型,在转换过程中,不能使用(String)这种方式强转,本不是String类型,可以使用toString(),也可以使用String.valueOf(),更简单的方式是用空字符串来转换;

    public JSONResult test() {
        List<HashMap<String, Object>> result = qcDao.selectInfoByTest();  
        // toString
        int flags=Integer.parseInt(result.get(0).get("flags").toString()); 
        // String.valueOf
        int flags2=Integer.parseInt(String.valueOf(result.get(0).get("flags")));
        // 空字符串
        int flags3=Integer.parseInt(result.get(0).get("flags")+"");
        return JSONResult.ok(flags+flags2+flags3);
    }

需要注意的是,在强转之前最好判断一下是否为空,空字符串,类型是否匹配,避免强转失败;

sum 返回映射问题(sum报表统计接口返回)

MyBatis sum 返回值映射

mapper.xml代码

 <select id="pieChart"    resultType="map">
       select   sum(com.thinkmoney*ord.commnumber)  as totalPrice , com.category as  category  from commodity com,orders ord
        where com.commid=ord.commid and ord.orderstatus=1
        GROUP BY com.category
 </select>

pojo

 private static final long serialVersionUID = 1L;
    /**
     * 订单id
     */
	private String id;
    /**
     * 订单编号
     */
	private String ordernumber;
    /**
     * 下单时间
     */
	private Date ordertime;
    /**
     * 商品名
     */
	private String commname;
    /**
     * 商品id
     */
    private String commid;
    /**
     * 商品描述
     */
    private String commdesc;
    /**
     * 购买数量
     */
	private Integer commnumber;
    /**
     * 商品单价
     */
	private BigDecimal price;
    /**
     * 收货地址
     */
	private String useraddress;
    /**
     * 订单状态 0未支付 1正常 2删除
     */
	private Integer orderstatus;
    /**
     * 收货人
     */
	private String username;
    /**
     * 收货人手机号
     */
	private String mobilephone;
    /**
     * 发货状态 0未发货 1已发货 2确认收货
     */
	private Integer kdstatus;
    /**
     * 快递编号
     */
	private String kdnumber;
    /**
     * 买家id
     */
	private String buyuserid;
    /**
     * 卖家id
     */
	private String selluserid;
	private  Commodity commodity;
	private  BigDecimal  totalPrice;

controller

 /**
     * 管理员首页 饼图
     * */
    @GetMapping("/echars/piechart")
    public String piechart(HttpSession  session,HttpServletRequest request){
        List<HashMap<String,Object>>  result =ordersService.pieChart();
        List<String>  totalPriceList= new ArrayList<String>();
        List<String>  categoryList= new ArrayList<String>();
        for( Map<String, Object> mapList : result ) {
            totalPriceList.add(mapList.get("totalPrice").toString());
            categoryList.add(mapList.get("category").toString());
        }
        session = request.getSession();
        System.out.println("totalPriceList:"+totalPriceList+",categoryList:"+categoryList);
        session.setAttribute("totalPriceList",totalPriceList);
        session.setAttribute("categoryList",categoryList);
        return "/admin/echars/piechart";
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis中传递多个参数的4种方法总结

    前言 现在大多项目都是使用Mybatis了,但也有些公司使用Hibernate.使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数.面对各种复杂的业务场景,传递参数也是一种学问. 下面给大家总结了以下几种多参数传递的方法. 方法1:顺序传参法 #{}里面的数字代表你传入参数的顺序. 这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错. 方法2:@Param注解传参法 #{}里面的名称对应的是注解 @Param括号里面修饰的名称. 这种方法在参数不多的情况还

  • Mybatis中如何使用sum对字段求和

    目录 使用sum对字段求和 避免Mybatis sum求和返回null 使用sum对字段求和 如下sql,为计算用户收益总和:   <select id="getTotalIncome" resultType="com.lws.test.modules.user.entity.UserIncomeEntity">     select sum(income) as totalIncome     from income_log     where uid

  • mybatis sum(参数) 列名作为参数的问题

    目录 sum(参数) 列名作为参数 注意事项 mybatis注解sql sum(参数)传参写法 sum(参数) 列名作为参数 项目中有很多个字段,当字段为空的时候,求该列的平均值并赋值给该字段.如:       id name age 当我需要插入一条数据的时候,这条数据的age为空,那么需要先从数据库查询age的平均值,然后赋值给当前的数据.当字段很多的时候就需要列名作为参数查询了 mapper.xml   <select id="getGtAvg" parameterType

  • MyBatis的SUM映射问题及解决

    目录 SUM映射问题 原因 解决方式 sum 返回映射问题(sum报表统计接口返回) MyBatis sum 返回值映射 SUM映射问题 当我们根据类别进行统计,返回的数据类型为HashMap<String,Object>,获取数值类型,容易报 java.math.BigDecimal cannot be cast to java.lang.Integer 场景如下: // Mapper层 <select id="selectInfoByTest" resultTyp

  • mybatis某些字段无法映射成功的解决

    随笔记录下: 刚刚遇到一个mybatis中reultMap定义正确column与property也都正确,字段的getset方法也都有,但是返回对象时,有些字段可以对应上有一些则不可以. 找了好久才发现在sql语句中的 resultMap 写成了 resultType... 很low但是痛.改成resultMap一切正常! 补充知识:MyBatis学习总结--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况

  • MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题

    在项目开发中,我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的情况,下面小编给大家演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突问题,感兴趣的朋友一起学习吧. 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, or

  • Mybatis中Mapper映射文件使用详解

    紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明. Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.delete.select(增删改查);cache.cache-ref.resultMap.parameterMap.sql. 下

  • 基于mybatis查询结果映射不到对象的处理

    目录 mybatis查询结果映射不到对象 项目场景: 问题描述: 原因分析: 解决方案: mybatis结果映射遇到的问题 错误如下: 解决: mybatis查询结果映射不到对象 项目场景: 使用mybatis+springboot 进行数据库的数据查询操作,一直拿不到返回结果. 问题描述: 后端dao层(service层调mapper,方法的返回结果一直null)代码一直空指针, APP 中接收数据代码: //分类名称 Integer blogCategoryId = blog.getBlog

  • Mybatis出现ORA-00911: invalid character的解决办法

    今天在项目中,使用Mybatis对oracle数据库进行操作的时候,报出ORA-00911: invalid character的错误,检查了一下SQL,发现都书写正确啊,复制到plsql上执行也都没问题,这什么原因呢? 注意:这里说的是用navicat导出查询数据的时候报错:ORA-00911: invalid character 主要原因是这里的sql是不允许带最后的分号的,删掉就好了 在plsql等工具中写完后习惯性的打上;号,在复制时也要注意啊!! 以上所述是小编给大家介绍的Mybati

  • MyBatis多对多映射初识教程

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 在上篇文章给大家介绍MyBatis一对一映射初识教程. 下面给大家说下mybatis多对多映射知识,具体详情如下所示: 多对多的例子也不少,比如课程与学生之间的关系

  • Mybatis传递多个参数的解决办法(三种)

    小编给大家分享三种方案解决mybatis传递多个参数的问题,具体介绍如下所示: 第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_a

  • 使用MyBatis进行数据库映射的方式

    在Java中,MyBatis是1个支持自定义SQL的持久层框架,它可以存储过程和高级的映射. 在正式介绍之前,我们首先通过mvn进行安装,我们将下面的内容添加到 pom.xml 配置文件中: <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency

  • Idea 2020.2安装MyBatis Log Plugin 不可用的解决方法

    之前使用Mybatis Log Plugin 是个非常顺的工具,刚才突然想用了,就又安装了一次就去使用了结果直接报错了,显示不能使用,仔细看了看,原来是没有授权,我用的是2020版本的idea,之前使用的2019的可以正常使用. 整理了一个2020可用的,亲测可用: 链接: https://pan.baidu.com/s/1kW0qAPcItDOMLIbjeLSU9A 提取码: xrh2 推荐阅读: IDEA2020.2.2激活码与IntelliJ IDEA2020注册码及IntelliJ全家桶

随机推荐