java.lang.Long cannot be cast to java.util.Map-Oracle查詢異常處理


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集合類型的數據,還是需要慎用,避免出現一些意外的異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM