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

Mybatis返回结果封装map过程解析

程序员文章站 2022-06-15 14:12:13
需求根据课程id 列表,查询每个课程id的总数,放到一个map里最简单的就是循环遍历,每一个都查询一次网上说mybatis可以返回map 和 list两种类型尝试直接返回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,那么就不能通过这种方法了,这种方法如果查询不到是没有值的,还是老老实实的循环吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。