mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

LambdaQueryWrapper#apply 通过and or 拼接多个sql出现问题,apply一整个sql就正常

Open zzzzzyw opened this issue 2 years ago • 2 comments

当前使用版本(必填,否则不予处理)

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);
        }

报错信息

没有报错,也有可能提问者比较菜

zzzzzyw avatar Apr 12 '22 09:04 zzzzzyw

能否提供一下代码示例供复现

VampireAchao avatar Apr 19 '22 05:04 VampireAchao

可以提供一下代码示例供复现

需求找出 22:00-5:00之间的数据

1.数据库 customer_body_metrics 字段存的时间戳字段 version image 数据库查询语句

#因为从晚上到凌晨所以分段查询出来
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);
        }

zzzzzyw avatar Apr 19 '22 10:04 zzzzzyw

java.time.DateTimeException: Invalid value for HourOfDay (valid values 0 - 23): 24????

miemieYaho avatar Aug 02 '23 08:08 miemieYaho