invalid comparison_ java.time.LocalDateTime and java.lang.String

110 阅读1分钟

前言

联调时发现通过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 startLastTime !=''">
      <![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 startLastTime !=''">
  <![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>