Map<String, Object> map一、問題由來
測試環境中進行測試時,某一個接口頻繁報一個錯,java.lang.Long cannot be cast to java.util.Map。從字面意思理解就是Long類型的數據不能轉換為Map集合對象;
之前是查詢mysql,現在修改為查詢Oracle,所以報了這個錯誤。正常來說不應該報這個錯,可實際情況卻是實實在在的報了這個錯。
二、問題分析
查看詳細錯誤日志,Service中的異常是這里拋出來的,這種查詢數據,處理數據的方式可以參照我寫的另外一篇文章 https://www.cnblogs.com/yilangcode/p/13748539.html
用法就不在多贅述。大致作用就是將返回的查詢結果集映射成一個map集合,方便其他地方使用。由於之前遇到過類似的操作,就是將查詢的結果映射成一個集合,使用mysql
和mybatis的時候,使用小寫可以正常映射。可是切換為Oracle后,查詢返回的結果中,列是大寫,映射為map集合時key和value必須要大寫才行,這是通過實踐得出的經驗。
帶着這樣的疑問,不知道這次是不是同樣的問題,然后開始修復BUG,因為之前也是報類似的錯誤。
三、解決方案
嘗試一:
將之前獲Map集合中取數據的方式,修改為通過大寫字母獲取。測試這種修改方式的結果為查詢時沒報錯,主要是由於本地測試沒數據。以為問題解決了,部署到測試環境后,
重新測試仍然報錯,而且錯誤也是一模一樣的,說明問題沒有解決。后來發現原代碼也存在問題,因為使用map.get()方法永遠只能獲取到value的值,鍵不能正確獲取到。
和同事討論了一下,發現異常實際上是上圖中的Map<String, Object> map = resultContext.getResultObject();這一行代碼拋出的。仔細一分析才知道問題的原因:使用
Oracle查詢時,返回的數據是只有兩列,一列是字符串類型,一列是count()函數統計的 結果為Long類型。Mybatis查詢到結果后,不能將Long類型的值映射到
Map<String, Object> 中,所以報錯。
嘗試二:
使用mybatis查詢時,不在直接進行轉換,而是先將結果查詢出來,然后在將結果手動裝入到map集合中,如下圖所示。
測試結果完全可行。
注意事項:在使用Mybatis進行查詢時,如果想將查詢結果直接映射為map集合類型的數據,還是需要慎用,避免出現一些意外的異常。