1. 程式人生 > >mybaits3.3.0date型別資料判斷非空報錯

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語句

  1. <select id="selectByCreateTime" resultMap="userMap">

  2. select * from user

  3. <where>

  4. <if test="createTime != null and createTime !='' " >

  5. date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})

  6. </if>

  7. </where>

  8. </select>

其中date()函式只是用來把年月日時分秒的日期擷取為年月日, 這個對於該異常沒有任何影響

在測試類中建立實體併為其屬性賦值

  1. User user=new User();

  2. user.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-18"));

然後執行查詢方法dao.selectByCreateTime(user)的時候就報錯了

  1. Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:

  2. ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

  3. ### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

  4. at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

  5. at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)

  6. at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)

  7. at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)

  8. at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)

  9. at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)

  10. at com.sun.proxy.$Proxy0.selectByCreateTime(Unknown Source)

  11. at mybatis.Test.buyerInfoTimeTest(Test.java:53)

  12. at mybatis.Test.main(Test.java:39)

  13. Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

  14. at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:92)

  15. at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:142)

  16. at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:794)

  17. at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:53)

  18. at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

  19. at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)

  20. at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)

  21. at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

  22. at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)

  23. at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)

  24. at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458)

  25. at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44)

  26. at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)

  27. at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)

  28. at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)

  29. at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55)

  30. at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33)

  31. at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41)

  32. at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:280)

  33. at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:80)

  34. at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)

  35. ... 7 more



看樣子是因為型別不符合, 但是想了想, Date型別對應MySQL的datetime, 以及mapper中jdbcType都沒問題啊. 而且完全一樣的東西在原工程中是完全正常的. 既然都是一樣的程式碼, 那就找找倆工程有啥不一樣的吧

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

原工程中配置的是mybatis-3.2.8, 而我測試工程中用的是mybatis-3.3.0.後來在網上找了一下才知道, 原來這是mybatis 3.3.0中對於時間引數進行比較時的一個bug. 如果拿傳入的時間型別引數與空字串''進行對比判斷則會引發異常. 所以在上面的程式碼中去該該判斷, 只保留非空判斷就正常了

  1. <if test="createTime != null and createTime !='' " >

  2. date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})

  3. </if>

改為

  1. <if test="createTime != null">

  2. date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})

  3. </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