zoukankan      html  css  js  c++  java
  • mybatis返回结果封装为map的探索

    需求

    根据课程id 列表,查询每个课程id的总数,放到一个map里

    最简单的就是循环遍历,每一个都查询一次
    网上说mybatis可以返回Map 和 List<Map>两种类型

    尝试

    直接返回Map类型

    <select id="listLessonSumByCourseIdList" resultType="java.util.HashMap">
        SELECT course_id, count(1)
        FROM lesson
        WHERE status = 0
        GROUP BY course_id;
    </select>

    返回的结果是:

    {
    "course_id":2,
    "count(1)":13
    }

    即便我的数据库里有很过个id,返回结果也只有这一条数据。

    如果直接使用 Map<Long, Integer> 类型强转,会报错
    Could not write JSON: java.lang.String cannot be cast to java.lang.Number; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.lang.String cannot be cast to java.lang.Number

    所以是不能直接返回Map的,而是先返回List<Map>

    最终实现

    Dao 类中
      List<HashMap<String,Object>> listLessonSumByCourseIdList();

    Mapper.xml

    <select id="listLessonSumByCourseIdList" resultType="java.util.HashMap">
        SELECT course_id as 'key', count(1) as 'value'
        FROM lesson
        WHERE type != 1 AND status = 0
        GROUP BY course_id;
    </select>

    ServerImpl 中, 将List<Map> 转成 Map

    public Map<Long, Long> listLessonSumByCourseIdList() {
        Map<Long, Long> map = new HashMap<>();
        List<HashMap<String, Object>> list = courseDao.listLessonSumByCourseIdList();
        if (list != null && !list.isEmpty()) {
            for (HashMap<String, Object> map1 : list) {
                Long key = null;
                Long value = null;
                for (Map.Entry<String, Object> entry : map1.entrySet()) {
                    if ("key".equals(entry.getKey())) {
                        key = (Long) entry.getValue();
                    } else if ("value".equals(entry.getKey())) {
                        value = (Long) entry.getValue();
                    }
                }
                map.put(key, value);
            }
        }
        return map;
    }

    PS:count(1) 数据库中查询这个默认是Long类型,转Integer会报错,所以返回类型是Map<Long, Long>,而不能是Map<Long, Integer>
      java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

    PPS:但是通过这种方法查询出的数据有一些问题,如果我们想要的数据是,即便没有值,也应该返回0,那么就不能通过这种方法了,这种方法如果查询不到是没有值的,还是老老实实的循环吧

    原创文章,欢迎转载,转载请注明出处!

  • 相关阅读:
    旋转卡壳(1)求凸包(点集)直径 poj 2187
    求解平面最近点对的问题
    java中的内部类初识
    java中的多重继承
    ObjectiveC中的Protocols
    Mac中配置java的src.jar
    Mac OS X Lion无线网络问题
    Xcode中修改默认文件头部注释
    全文索引查询和like查询对比
    获取Repeater选中行索引
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/mybatis_map.html
Copyright © 2011-2022 走看看