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,那么就不能通过这种方法了,这种方法如果查询不到是没有值的,还是老老实实的循环吧
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。