前言
联调时发现通过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>