• Mybatis异常:java.lang.NumberFormatException: For input string: "S"


    MyBatis异常日志如下:

    Caused by: java.lang.NumberFormatException: For input string: "S"
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
        at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
        at java.lang.Double.parseDouble(Double.java:538)
        at org.apache.ibatis.ognl.OgnlOps.doubleValue(OgnlOps.java:243)
        at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:100)
        at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:143)
        at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:802)
        at org.apache.ibatis.ognl.ASTEq.getValueBody(ASTEq.java:52)
        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:470)
        at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:434)
        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.IfSqlNode.apply(IfSqlNode.java:35)
        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:292)
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
        at com.shengpay.hpsplus.db.interceptor.SlowSqlInterceptor.intercept(SlowSqlInterceptor.java:47)
        at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
        at com.sun.proxy.$Proxy185.query(Unknown Source)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
        ... 45 more

    将mybatis的日志级别调整为debug仍然没有看到sql打印,因此排除sql异常,可能是sql预处理报错了。

        <logger name="org.apache.ibatis">
            <level value="debug" />
        </logger>

    仔细排查异常,原来是如下地方有问题:

    <if test="dataType == 'F'">
          and INSERT_TIME > sysdate - 1
    </if>

    错误分析:

    1、test=“datatype == ‘F’ ” 使用的OGNL表达式,而datatype的类型定义如下:

    <result column="DATA_TYPE" jdbcType="CHAR" property="dataType" />

    该地方想表达的含义是:如果datatype == 字符'F'的条件成立

    但是呢,DB中字段的定义是char,可是,在我们使用(test=“datatype == ‘F’ ”)这个ognl表达式做判断的时候,使用的是datatype,而datatype是如何定义的呢?

    private String dataType;

    问题找到了:

    (test=“datatype == ‘F’ ”) 这个表达式,使用了datatype 这个字符串'F'这个字符做比较,字符和字符串比较,mybatis会做数据类型的统一转换,好了出问题了!!!

    解决方案,吧'F'当做字符串对待,用双引号标示:"F"

    <if test='dataType == "F"'>
          and INSERT_TIME > sysdate - 1
    </if>

    搞定!!!

    参考文章

  • 相关阅读:
    在独立的文件里定义WPF资源
    Irrlicht 3D Engine 笔记系列 之 教程6- 2D Graphics
    Java实现二叉树的创建、递归/非递归遍历
    NDK在windows下的开发环境搭建及开发过程
    硬件路由转发原理浅析
    ubuntu下vim中内容拷贝到浏览器
    python调用Java代码,完毕JBPM工作流application
    C++组合通信
    linux杂谈(十八):DNSserver的配置(一)
    Codeforces 550D. Regular Bridge 构造
  • 原文地址:https://www.cnblogs.com/huahua035/p/8880222.html
Copyright © 2020-2023  润新知