mybatis group by查询返回map类型


故事的发生是这样的. . . . . . .

一天 我发现我们的页面显示了这样的汇总统计数据,看起来体验还不错哦~~

然后,我发现代码是这样滴:分开每个状态分别去查询数量。

额e,可是为嘛不使用简单便捷的 group by 语句呢

我们知道MyBatis提供了selectMap的方法,查询结果为hashmap。查询的时候,可以配置相应的传入参数和查询返回结果。

 

对应dao 层代码如下:

//查询各状态对应的数量,三个参数分别对应,select的id,查询参数,返回hashmap的key
   public Map<String, Map<String,Integer>> sumStatusByParam(SearchParam searchParam ){ return (Map<String, Map<String,Integer>>)sqlSessionTemplate.selectMap(SEARCH_NAME_SPACE + "sumStatusByParam",searchParam,"status"); }
 

对应mybatis的数据查询语句:

<!-- 查询各状态对应的数量 -->
    <select id="sumStatusByParam" parameterType="com.selicoco.model.dto.param.SearchParam" resultType="hashmap">
        select status as status,count(id) as num from selicoco_order where 1=1
        <if test="name != null" >
            and name like concat('%',#{name,jdbcType=VARCHAR},'%') </if>
        group by status; </select>
</mapper>

最后得到的结果是这样的。

 

我以为这样就可以了,但是,count(1)这样出来的结果是一个Long类型,并不能直接转换成Integer,虽然查询的时候并没有报错,但是读取的时候一定会告诉你转换失败的,

所以我只能默默的把map里面的 Integer转换成Long类型。

对于这样的结果,我们如果要获取的话,得这样去取

map.get("WAIT_CONFIRM").get("num");

这样其实是比较费力的。明白其中的原理其实可以写一个公用的中间层方法,将里面的map转换出来。因为我的状态并不多,所以直接就使用上面的方式去取值了。

 

selectMap实现机制:

selectMap调用selectList进行查询,返回一个List<hashMap>,mybatis底层查询返回其实都是hashMap。

然后再从map里面取出我们指定的key值,放入一个map<key,value>,而value就是底层查询出来的整个hashmap的值。

 

源码如下:

public Map selectMap(String statement, String mapKey) { return selectMap(statement, null, mapKey, RowBounds.DEFAULT); } public Map selectMap(String statement, Object parameter, String mapKey) { return selectMap(statement, parameter, mapKey, RowBounds.DEFAULT); } public Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) { final List list = selectList(statement, parameter, rowBounds); final DefaultMapResultHandler mapResultHandler = new DefaultMapResultHandler(mapKey); final DefaultResultContext context = new DefaultResultContext(); for (Object o : list) { context.nextResultObject(o); mapResultHandler.handleResult(context); } return mapResultHandler.getMappedResults(); } public List selectList(String statement) { return selectList(statement, null); } public List selectList(String statement, Object parameter) { return selectList(statement, parameter, RowBounds.DEFAULT); } public List selectList(String statement, Object parameter, RowBounds rowBounds) { try { MappedStatement ms = configuration.getMappedStatement(statement); return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER); } catch (Exception e) { throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e); } finally { ErrorContext.instance().reset(); } }
public DefaultMapResultHandler(String mapKey) { this.mapKey = mapKey; } public void handleResult(ResultContext context) { final Object value = context.getResultObject(); final MetaObject mo = MetaObject.forObject(value); final Object key = mo.getValue(mapKey); mappedResults.put(key, value); }
 

想要返回一个对象可以参考:http://www.denghuafeng.com/post-238.html

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM