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”,那么就不能使用这种方法了,这种方法如果查询不到是没有值的,还是老老实实的循环吧
原创文章,欢迎转载,转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 博客园2025新款「AI繁忙」系列T恤上架
· Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)
· C# LINQ 快速入门实战指南,建议收藏学习!
· Redis实现高并发场景下的计数器设计
· 上周热点回顾(4.7-4.13)