mybaits3.3.0date型別資料判斷非空報錯
開發中改動mapper檔案後需要重新編譯釋出, 由於工程比較大非常耗時, 所以為方便快速測試乾脆寫了一個小java工程. 工程中用到的dao, mapper和實體類都是從工程中拷出來的, 資料庫也是同一個. 但是遇到一個比較奇怪的問題
實體類中有一個屬性
private Date createTime;
對應該屬性資料庫中定義的是
create_time datetime
mapper中該屬性對映的定義
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
以下是mapper中對應Dao方法SQL語句
-
<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()函式只是用來把年月日時分秒的日期擷取為年月日, 這個對於該異常沒有任何影響
在測試類中建立實體併為其屬性賦值
-
User user=new User();
-
user.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-18"));
然後執行查詢方法dao.selectByCreateTime(user)的時候就報錯了
-
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. 如果拿傳入的時間型別引數與空字串''進行對比判斷則會引發異常. 所以在上面的程式碼中去該該判斷, 只保留非空判斷就正常了
-
<if test="createTime != null and createTime !='' " >
-
date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})
-
</if>
改為
-
<if test="createTime != null">
-
date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})
-
</if>
相關推薦
mybaits3.3.0date型別資料判斷非空報錯
開發中改動mapper檔案後需要重新編譯釋出, 由於工程比較大非常耗時, 所以為方便快速測試乾脆寫了一個小java工程. 工程中用到的dao, mapper和實體類都是從工程中拷出來的, 資料庫也是同一個. 但是遇到一個比較奇怪的問題 實體類中有一個屬性 priv
String型別字串判斷非空
String型別的字串的非空判斷還是經常會用到滴,但是前幾天用的過程中發現了一個問題:假如有一個字元差為str if(str == null || str.equals("")) 或者 if("".equals(str) || str == null
JAVA判斷各種型別資料是否為空
1、判斷list是否為空(Map、Set同list) if(list != null && list.size() != 0){ } if(list != null && !list.isEmpty()){ } list!=null:
KindEditor獲取多個textarea文本框的值並判斷非空
div 編輯器 fill star fontsize 取值 pop 獲取 sta kindeditor官網:http://kindeditor.net/demo.php 如何獲取多個KindEditor中textarea文本框的值,方式很多種(帶有HTML標簽)。
判斷非空字串是否由子串首尾拼接
如輸入abcabc,則返回abc,若輸入abcbc,返回false. 大致思路是,從第一個字元開始,到中間的字元,依次生成子串b,呼叫方法,判斷是否在父串a中由首尾拼接而成。判斷輸入的字串a是否為這個字串b的倍數,若不是,直接返回false,若是,迴圈擷取和剛剛找到的字元串同長度的字
java 判斷非空
後臺: String type = request.getParameter("type"); if(!type.equals("add")) { } if(!StringUtil.isNullString(ste_createTime) && !StringUtil.isNu
KindEditor獲取多個textarea文字框的值並判斷非空
在網上找了一大圈都沒有找到我想要的結果,沒辦法,看了部分的KindEditor官方文件,現在來稍微總結一下。 正文: 如何獲取多個KindEditor中textarea文字框的值,方式很多種(帶有HTML標籤)。 var introduction = docume
Mybatis int 判斷非空的坑
Mybatis 中,alarmType 是int型別。如果alarmType 為0的話,條件判斷返回結果為false,其它值的話,返回true。 <if test="alarmType != null and alarmType != ''"> alarm_type=#{alarmType}
js判斷非空值
function isNull(v){ switch (typeof v){ case 'undefined' : return true; case 'string' : if(trim(v).length == 0) return true; brea
mybatis 插入oracle xmltype型別的資料內容超過4000報錯
資料庫表: create table BOOK ( book_id NUMBER not null, book_name XMLTYPE, book_price NUMBER ) JavaBean: public class Book { pr
XerCMS-1.0.3代碼審計(文件名報錯註入後臺getshell)
each orb his jpg pla module 將不 last self 鏈接:https://share.weiyun.com/6b98e41d036967178e1a21fb88ed340f (密碼:YnNY) 文件名報錯註入 index.php?m=memb
SSD Tensorflow訓練自己的資料集,遇到報錯absl.flags._exceptions.IllegalFlagValueError: flag --num_classes==: 求助
按照此部落格訓練到“五.訓練”這一步報錯。 連結:https://blog.csdn.net/Echo_Harrington/article/details/81131441 下面是bash 的 train.sh 檔案博主給的內容 D
VUE.JS 使用axios資料請求時資料繫結時 報錯 TypeError: Cannot set property 'xxxx' of undefined 的解決辦法
正常情況下在data裡面都有做了定義 在函式裡面進行賦值 這時候你執行時會發現,資料可以請求到,但是會報錯 TypeError: Cannot set property 'listgroup' of undefined 主要原因是: 在 then的內部不能使用Vue的例項
大資料hive之啟動報錯:system:java.io.tmpdir
解決方法: 在hive下建立個tmpdir目錄 在hive-site.xml中新增以下內容 <property> <name>system:java.io.tmpdir</name> <value&
Android Studio 3.0升級之後匯入github專案報錯
1.Unable to load class ‘org.gradle.api.internal.component.Usage’. 解決辦法:專案根目錄的 build.gradle 中 修改如下程式碼: buildscript { repositories {
studio2.3.3 jdk1.8 1.7不相容報錯的問題
報錯描述 Error:Error converting bytecode to dex: Cause: Dex cannot parse version 52 byte code. This is caused by library dependencies that ha
Json資料生成實體類報錯
報的錯: org.json.JSONException: Expected a ',' or '}' at 129 [character 37 line 4] at org.json.JSONTokener.syntaxError(JSONTokener.java:433) at org.json.J
前端之路——jQuery第三課(利用已學的jq,製作一個失去焦點時,為空報錯的表單驗證)
又來了,穩穩的來到了jQuery的第三課。。。今天任務比較難啊,自己需要寫個失去焦點時,為空報錯的表單驗證。 其實簡單想想,很好做 我們經常在那些輸入賬號密碼的介面就有這判斷驗證,好的,收拾心情,開始學習!!! 今天覆習的內容: 1:函式寫法 2:顯示與隱藏 3:焦點事件
laravel5.5在第一次執行資料遷移,系統報錯(入坑)
資料遷移 * 所有建立的遷移檔案都被統一放在 database/migrations 資料夾 * Laravel 預設建立的兩個遷移檔案,一個用於構建使用者表,一個用於構建密碼重置表 * * database/migrations/2014_10_1
使用hive 對lzo資料分析時的報錯
之前建立map作業 將文字檔案通過combineInputFormat 合併 小檔案並壓縮為lzo檔案 ,作業設定: conf.setInt("mapred.min.split.size", 1); conf.setLong("mapred