连初级都算不上的代码小白 2024-03-04 20:27 采纳率: 52.4%
浏览 16

mybatis if条件的判断问题


<if test="beginTime!=null">
                and order_time &gt; #{beginTime}
            </if>

为什么上面的没问题、下面的报错

<if test="beginTime!=null and beginTime!=  ' ' ">
                and order_time &gt; #{beginTime}
            </if>

beginTime是LocalDateTime类型、order_time 是MySQL的datetime
错误信息:

img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-04 20:28
    关注

    引自免费微信小程序:皆我百晓生

    在MyBatis中,<if>标签用于条件判断,其内部的test属性接收OGNL表达式。对于您提供的问题,出现错误的原因在于第二个<if>标签中的条件表达式对LocalDateTime类型的beginTime变量进行了不恰当的空字符串比较。

    首先,请确保理解MySQL数据库中datetime类型和Java中的LocalDateTime类型的区别:

    1. MySQL datetime类型:表示日期和时间,存储格式如'2023-01-01 10:00:00',它不能直接与空字符串进行比较。
    2. Java LocalDateTime类型:表示日期和时间,但不包含时区信息,也不能与空字符串直接比较。

    在您的场景下,当beginTime为非null的LocalDateTime对象时,尝试将它与空字符串 ' ' 进行比较是非法的,因为它们无法进行有意义的逻辑运算。

    正确的做法是仅检查beginTime是否为非null即可,就像第一个<if>标签那样:

    <if test="beginTime!=null">
        and order_time &gt; #{beginTime}
    </if>
    

    如果您确实需要排除某个特定值(例如默认值或代表空值的时间点),则应该将该特定值实例化为一个LocalDateTime对象并与之比较,而不是与空字符串比较。例如,假设要排除的是LocalDateTime.MIN,则可以这样写:

    <if test="beginTime != null && beginTime != LocalDateTime.MIN">
        and order_time &gt; #{beginTime}
    </if>
    

    总之,在这种情况下,只需测试beginTime是否非null就足够了,不需要进一步与空字符串进行比较。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月4日