更新時間:2021-09-14 10:50:20 來源:動力節點 瀏覽2785次
表:members中的gender列是這樣:
Female
Female
Male
Female
Male
Male
Male
Male
Male
現在我們想統計members中男女人數分別是多少,很顯然返回的結果應該是這樣的:
Femal: 3
Male: 6
對應的xml文件中的查詢語句:
<select id="genderCount" resultMap="genderCount">
select
gender,
count(gender) count
from members
group by gender
</select>
<resultMap id="genderCount" type="java.util.HashMap">
<result column="gender" property="key" javaType="java.lang.String"/>
<result column="count" property="value" javaType="java.lang.Integer"/>
</resultMap>
問題一: 按照常規想法,mybatis返回的結果應該是map對象,并且里面包含兩個entry。
所以,對應的mapper接口應該是這樣的子的:
Map<String, Integer> getGenderCount();
但這樣定義接口會異常,大概的意思是:查詢結果要么是 ull,要么是只有一個,而現在卻出現多個結果。
這樣的報錯信息很明顯了,mapper接口應該定義成:
List<Map<String, Integer>> getGenderCount();
xml文件中的查詢結果是list,這個list中包含兩個map對象,每一個map對象中只包含一個entry。
(好像使用resultHandler可以讓xml中查詢的返回結果為map對象中包含兩個entry這種形式)
問題二:list中有兩個map,那每個map中的entry是什么呢? 同樣是按照常規想法,兩個map 中應該分別應該是:{Femal:3},{Male: 6}。但實際的返回結果是:
[
map1:{
key:Femal,
value: 3
}
map2:{
key:Male,
value: 6
}
]
所以需要轉換成我們期望的類型。
在這個demo中,需要將mapper接口定義成這樣子。
List<Map<String, Object>> getGenderCount();
因為value的類型能是String可能是Integer。
對xml查詢的List<Map<String, Object>>結果做轉化,代碼如下:
private Map<String, Integer> getMetricsLatestVersion(
List<Map<String, Object>> genderCountList) {
Map<String, Integer> genderCount = new HashMap<>();
for (Map<String, Object> kv : genderCountList) {
String key = null;
Integer value = null;
for (Map.Entry<String, Object> entry : kv.entrySet()) {
if (entry.getKey().equals("key")) {
key = (String) entry.getValue();
} else {
value = (Integer) entry.getValue();
}
}
genderCount.put(key, value);
}
return genderCount;
}
以上就是對“Mybatis返回結果為Map”的介紹,大家如果想了解更多Java知識,可以到動力節點的Java視頻頁面進行學習,里面有從入門到精通的全套視頻教程可以免費下載學習,這對想學習Java的小伙伴來說會有很大幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習