1. 程式人生 > >mybatis group by查詢返回map類型

mybatis group by查詢返回map類型

macro fig link context hand out 取值 image 對象

故事的發生是這樣的. . . . . . .

一天 我發現我們的頁面顯示了這樣的匯總統計數據,看起來體驗還不錯哦~~

技術分享

然後,我發現代碼是這樣滴:分開每個狀態分別去查詢數量。

額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.csg.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

mybatis group by查詢返回map類型