使用mybatis-plus传递的参数类型不同,查询结果不同。
mysql版本为8.x。
创建基本数据
create table sys_contract_config(
id int primary key auto_increment,
time_range varchar(42)
)
insert into sys_contract_config VALUES(1, '{"start":"2024-11-01", "end":"2024-12-01"}');
insert into sys_contract_config VALUES(2, '{"start":"2024-12-02", "end":"2024-12-30"}');
我需要根据 time_range字段进行查询出所有开始时间大于等于传入时间的数据。
select * from sys_contract_config where JSON_EXTRACT(time_range, '$.start') >= '2024-11-01'
拿到数据库运行,执行通过之后,将其放入到项目中。
mapper 文件
// 接口定义
List<Map<String, Object>> listContractConfigByLocalDate(@Param("start") LocalDate startDate);
// xml
<select id="listContractConfigByLocalDate" resultType="java.util.Map">
select * from sys_contract_config where JSON_EXTRACT(time_range, '$.start') >= #{start}
</select>
此时传递的参数为 LocalDate 类型,运行测试类后发现没有任何数据返回。
如果修改入参为Strin,则能正常查询到结果。
或者修改查询语句为
select * from sys_contract_config where JSON_UNQUOTE(JSON_EXTRACT(time_range, '$.start')) >= #{start}
使用 JSON_UNQUOTE() 去除掉取出的 start 字段值的双引号。此时,即使入参的类型为 LocalDate 也能正确查询到数据了。
mybatis-plus 在设置参数时,到底是将 LocalDate 转换成了啥?