在业务汇中总会遇到需要直接使用List<Map>返回格式的场景,以下是一个分组统计的案例。
1.Service代码
List<Map<String,Object>> statistics(@Param("name") String name);
2.mapper代码
在Mapper中直接使用 List 作为 resultType。
<select id="statistics" resultType="java.util.List">
SELECT type, count(0) FROM table WHERE name LIKE concat('%',#{name}::varchar ,'%') GROUP BY type
</select>
3.运行异常
运行报错,不支持的操作类型,不能将Map对象返回为一个List。
4.解决
在Service中的使用List<Map>接收,在mapper中只需要将resultType变为 Map 即可。
<select id="statistics" resultType="java.util.Map">
SELECT type, count(0) FROM table WHERE name LIKE concat('%',#{name}::varchar ,'%') GROUP BY type
</select>
5.@MapKey注解
除此之外,在mybatis中有一个@MapKey注解。
@MapKey 注解用于将查询结果映射为一个 Map 对象,其中 Map 的 key 是指定的列名或属性名,而 value 是查询结果的对象。
例如,在一个查询中,将查询结果以type字段的值作为 key,将实体对象作为 value 存入 Map 中,就可以使用 @MapKey 注解。
mapper中的代码不做改动。
@MapKey("type")
List<Map<String, Object>> statistics(@Param("name") String name);
加了mapKey注解,较之前多了一层key.