mybatis中關於枚舉類型轉字符串的錯誤分析

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: com.jd.jmq.data.model.Metric$Aggregator and java.lang.String

### Cause: java.lang.IllegalArgumentException: invalid comparison: com.jd.jmq.data.model.Metric$Aggregator and java.lang.String

表面上看是因爲類型不符合, 但是想了想, 枚舉類型默認可以自動轉字符串的,以及mapper中jdbcType都沒問題啊. 而且完全一樣的東西在原工程中是完全正常的. 既然都是一樣的代碼, 那就找找倆工程有啥不一樣的吧。

首先是MySQL jar版本不同. 換成原工程中的版本也無效. 然後是mybatis jar版本不一樣, 換成原工程中的版本問題就解決了!

原工程中配置的是mybatis-3.2.8, 而我測試工程中用的是mybatis-3.3.1.後來在網上找了一下才知道了原因:

原來這是mybatis 3.3.0中對於時間參數進行比較時的一個bug. 如果拿傳入的類型參數與空字符串''進行對比判斷則會引發異常. 所以在上面的代碼中去該該判斷, 只保留非空判斷就正常了。有時不必要的判斷反而是地雷。以後凡是遇到mybatis中的轉換錯誤的,一定要仔細審清錯誤,這樣才能定位原因,多半是由於代碼上的問題,看看是不是空指針了等等。不要上來就定位到版本或者框架的問題,一旦陷入錯誤思路很難解決問題。

錯誤範例:

<if test="type != null and type!=''">type = #{type},</if>

正確範例:

<if test="type != null">type = #{type},</if>

歡迎工作一到五年的Java工程師朋友們加入Java技術交流羣:659270626
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章