mybaits3.3.0date类型数据判断非空报错

2024-03-10 06:58

本文主要是介绍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类型数据判断非空报错的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793419

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分