mybatis-plus
mybatis-plus copied to clipboard
LambdaQueryWrapper#apply 通过and or 拼接多个sql出现问题,apply一整个sql就正常
当前使用版本(必填,否则不予处理)
3.2.0
该问题是如何引起的?(确定最新版也有问题再提!!!)
java LambdaQueryWrapper#apply 将里面的sql 通过 or and 分开拼接就会报错,拼接一整条就ok
重现步骤(如果有就写完整)
adbormal:
//处理跨天段时间
if(fromHour != null && toHour != null &&fromHour.isAfter(toHour)){
query.and( parent ->
parent.apply("from_unixtime(version / 1000, '%H:%i:%s') >= '" + fromHour.toString() + "'")
.apply("from_unixtime(version / 1000, '%H:%i:%s') < '" + LocalTime.of(24,00,00).toString() + "'")
.or( child ->
child.apply("from_unixtime(version / 1000, '%H:%i:%s') >= '" + LocalTime.of(00,00,00).toString() + "'")
.apply("from_unixtime(version / 1000, '%H:%i:%s') < '" + toHour.toString()+ "'"))
);
}
normal:
//处理跨天段时间
if(fromHour != null && toHour != null &&fromHour.isAfter(toHour)){
String [] str = {fromHour.toString(),toHour.toString()};
query.apply("from_unixtime(version / 1000, '%H:%i:%s') >= {0} and from_unixtime(version / 1000, '%H:%i:%s') < '24:00:00' or from_unixtime(version / 1000, '%H:%i:%s') >= '00:00:00' and from_unixtime(version / 1000, '%H:%i:%s') <= {1}", str);
}
报错信息
没有报错,也有可能提问者比较菜
能否提供一下代码示例供复现
可以提供一下代码示例供复现
需求找出 22:00-5:00之间的数据
1.数据库 customer_body_metrics 字段存的时间戳字段 version
数据库查询语句
#因为从晚上到凌晨所以分段查询出来
select * from customer_body_metrics
from_unixtime(version / 1000, '%H:%i:%s') >= '22:00' and from_unixtime(version / 1000, '%H:%i:%s') < '24:00:00' or from_unixtime(version / 1000, '%H:%i:%s') >= '00:00:00' and from_unixtime(version / 1000, '%H:%i:%s') <= '5:00'
然后将他转化为mybatis表达式:这样就会报错,没有报错信息,sql进断点就跳出来了
LambdaQueryWrapper<CustomerBodyMetricsEntity> query = new LambdaQueryWrapper<CustomerBodyMetricsEntity>();
query.and( parent ->
parent.apply("from_unixtime(version / 1000, '%H:%i:%s') >= '" + fromHour.toString() + "'")
.apply("from_unixtime(version / 1000, '%H:%i:%s') < '" + LocalTime.of(24,00,00).toString() + "'")
.or( child ->
child.apply("from_unixtime(version / 1000, '%H:%i:%s') >= '" + LocalTime.of(00,00,00).toString() + "'")
.apply("from_unixtime(version / 1000, '%H:%i:%s') < '" + toHour.toString()+ "'"))
);
但是将and 里面的sql写成一条语句就不会报错
LambdaQueryWrapper<CustomerBodyMetricsEntity> query = new LambdaQueryWrapper<CustomerBodyMetricsEntity>();
String [] str = {“22:00”,"5:00"};
query.apply("from_unixtime(version / 1000, '%H:%i:%s') >= {0} and from_unixtime(version / 1000, '%H:%i:%s') < '24:00:00' or from_unixtime(version / 1000, '%H:%i:%s') >= '00:00:00' and from_unixtime(version / 1000, '%H:%i:%s') <= {1}", str);
}
java.time.DateTimeException: Invalid value for HourOfDay (valid values 0 - 23): 24
????