欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis的SUM映射问题及解决

程序员文章站 2022-03-01 19:47:33
目录sum映射问题原因解决方式sum 返回映射问题(sum报表统计接口返回)mybatis sum 返回值映射sum映射问题当我们根据类别进行统计,返回的数据类型为hashmap

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";
    }

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