Mybatis中时间类型筛选查询报错_invalid comparison_ java.time.LocalDateTime and java.lang.String

博客主要讲述联调时使用LocalDateTime类型时间筛选数据报错问题。入参包含日期字符串,报错显示不能对LocalDateTime和String进行比较。经分析,这是MyBatis 3.3.*版本问题,该版本时间不能与空字符串比较。解决办法是移除startLastTime!=''的判断。

前言

联调时发现通过LocalDateTime类型时间进行筛选数据时,报错
java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String

一、问题

入参:{size: 10, current: 1, startDate: “2023-09-18”, endDate: “2023-09-19”}
报错:java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String

在这里插入图片描述

二、代码

接收dto:


private LocalDateTime startLastTime;


private LocalDateTime endLastTime;


private String channelId;


private LocalDateTime lastTime;


private Integer online;

private Integer isDelete;

sql语句:

<select id="queryPage"
  resultType="com.*.DetailsDTO"
  parameterType="com.*.CommonDTO">
  SELECT
  device.*,
  base.*,
  info.*
  FROM
  base_info AS base
  LEFT JOIN device_info AS device ON device.id = base.device_id
  LEFT JOIN status_info AS info ON base.id = info.machine_id
  <where>
    <if test="startLastTime != null and  startLastTime !='' ">
      <![CDATA[ and base.last_time >= #{startLastTime}]]>
    </if>
    <if test="endLastTime != null and endLastTime !=''">
      <![CDATA[ and base.last_time <= #{endLastTime}]]>
    </if>
    <if test="channelId != null and channelId !='' ">
      and base.channel_id = #{channelId}
    </if>
    <if test="isDelete != null and isDelete !=''">
      and base.is_delete = #{isDelete}
    </if>
    <if test="online != null and online == 1 ">
      <![CDATA[ and info.last_time >= #{lastTime}]]>
    </if>
      <if test="online != null and online == 0 ">
      <![CDATA[ and info.last_time < #{lastTime}]]>
    </if>
    </where>
    </select>

三、分析问题

问题点:

<if test="startLastTime != null and  startLastTime !='' ">
  <![CDATA[ and base.last_time >= #{startLastTime}]]>
</if>
<if test="endLastTime != null and endLastTime !=''">
  <![CDATA[ and base.last_time <= #{endLastTime}]]>
</if>

这个错误是由于mybatis版本问题导致,这个版本中时间不能与空字符串进行比较。3.3.*版本应该都会有这个问题。把LocalDateTime类型和string类型进行比较,就会出现这个错误这里的startLastTime是LocalDateTime类型的在进行if判断的时候和 ‘’ 空字符串进行比较,这里就会报这个错误。

四、解决问题

只需要把startLastTime!= ‘’ 移除就可以了

<if test="startLastTime != null ">
  <![CDATA[ and base.last_time >= #{startLastTime}]]>
</if>
<if test="endLastTime != null ">
  <![CDATA[ and base.last_time <= #{endLastTime}]]>
</if>
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端马农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值