?
原文鏈接:http://blog.csdn.net/wanghailong_qd/article/details/50673144
mybatis異常invalid comparison: java.util.Date and java.lang.String
開發中改動mapper文件后需要重新編譯發布, 由于工程比較大非常耗時, 所以為方便快速測試干脆寫了一個小java工程. 工程中用到的dao, mapper和實體類都是從工程中拷出來的, 數據庫也是同一個. 但是遇到一個比較奇怪的問題
?
實體類中有一個屬性
?
[java]?view plain
?copy private?Date?createTime;?? 對應該屬性數據庫中定義的是
?
[sql]?view plain
?copy create_time?datetime?? ?
mapper中該屬性映射的定義
?
[html]?view plain
?copy <result?column="create_time"?property="createTime"?jdbcType="TIMESTAMP"?/>?? ?
以下是mapper中對應Dao方法SQL語句
?
[html]?view plain
?copy <select?id="selectByCreateTime"?resultMap="userMap">????select?*?from?user?????<where>??????<if?test="createTime?!=?null?and?createTime?!=''?"?>????????date(create_time)?=?date(#{createTime,jdbcType=TIMESTAMP})??????</if>????</where>??</select>?? 其中date()函數只是用來把年月日時分秒的日期截取為年月日, 這個對于該異常沒有任何影響
在測試類中創建實體并為其屬性賦值
?
[java]?view plain
?copy User?user=new?User();??user.setCreateTime(new?SimpleDateFormat("yyyy-MM-dd").parse("2016-01-18"));?? ?
然后執行查詢方法dao.selectByCreateTime(user)的時候就報錯了
?
[java]?view plain
?copy Exception?in?thread?"main"?org.apache.ibatis.exceptions.PersistenceException:???###?Error?querying?database.??Cause:?java.lang.IllegalArgumentException:?invalid?comparison:?java.util.Date?and?java.lang.String??###?Cause:?java.lang.IllegalArgumentException:?invalid?comparison:?java.util.Date?and?java.lang.String??????at?org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)??????at?org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)??????at?org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)??????at?org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)??????at?org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)??????at?org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)??????at?com.sun.proxy.$Proxy0.selectByCreateTime(Unknown?Source)??????at?mybatis.Test.buyerInfoTimeTest(Test.java:53)??????at?mybatis.Test.main(Test.java:39)??Caused?by:?java.lang.IllegalArgumentException:?invalid?comparison:?java.util.Date?and?java.lang.String??????at?org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:92)??????at?org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:142)??????at?org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:794)??????at?org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:53)??????at?org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)??????at?org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)??????at?org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)??????at?org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)??????at?org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)??????at?org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)??????at?org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)??????at?org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)??????at?org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)??????at?org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)??????at?org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)??????at?org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)??????at?org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)??????at?org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)??????at?org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:280)??????at?org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:80)??????at?org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)??????...?7?more?? 看樣子是因為類型不符合, 但是想了想, Date類型對應MySQL的datetime, 以及mapper中jdbcType都沒問題啊. 而且完全一樣的東西在原工程中是完全正常的. 既然都是一樣的代碼, 那就找找倆工程有啥不一樣的吧
?
?
首先是mysql jar版本不同. 換成原工程中的版本也無效. 然后是mybatis jar版本不一樣, 換成原工程中的版本問題就解決了!
?
原工程中配置的是mybatis-3.2.8, 而我測試工程中用的是mybatis-3.3.0.后來在網上找了一下才知道, 原來這是mybatis 3.3.0中對于時間參數進行比較時的一個bug. 如果拿傳入的時間類型參數與空字符串''進行對比判斷則會引發異常. 所以在上面的代碼中去該該判斷, 只保留非空判斷就正常了
?
?
[html]?view plain
?copy <if?test="createTime?!=?null?and?createTime?!=''?"?>????date(create_time)?=?date(#{createTime,jdbcType=TIMESTAMP})??</if>?? ?
改為
?
[html]?view plain
?copy <if?test="createTime?!=?null">????date(create_time)?=?date(#{createTime,jdbcType=TIMESTAMP})??</if>??
轉載于:https://www.cnblogs.com/libin6505/p/8567138.html
總結
以上是生活随笔為你收集整理的mybatis异常invalid comparison: java.util.Date and java.lang.String的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。