mybatisplus 复杂查询,组合or,lambdaQuery

查询需求

多个and组合成一个组合条件,多个组合条件之间用或连接(or).
例如:

SELECT basic_rule_snapshot_id FROM alarm_info WHERE (
status = ? AND (
(basic_rule_snapshot_id = ? AND industry_device_id = ?) OR
(basic_rule_snapshot_id = ? AND industry_device_id = ?) OR
(basic_rule_snapshot_id = ? AND industry_device_id = ?)
)
)

lambdaQuery
 wrapper.select(AlarmInfo::getBasicRuleSnapshotId).eq(AlarmInfo::getStatus, AlarmStateEnum.RUNNING.getState());
        wrapper.and(w->{
                query.getIndustryDeviceSnapshotList().forEach(item->{
                    w.and(t->{
                        t.eq(AlarmInfo::getBasicRuleSnapshotId,item.getBasicRuleSnapshotId())
                                .eq(AlarmInfo::getIndustryDeviceId,item.getIndustryDeviceId());
                        w.or();
                    });
                });
        });

错误写法

容易出错的地方是or()的位置

List<String> serviceIds = query.getServiceIds();
if (CollUtil.isNotEmpty(serviceIds)) {
    wrapper.and(q ->
            serviceIds.forEach(serviceId -> {
                if (StrUtil.isBlank(serviceId) || !serviceId.contains("@")) {
                    return;
                }
                q.and(x->
                        x.eq(AlarmInfo::getSourceFrom, serviceId.split("@")[0])
                        .eq(AlarmInfo::getPointLongCode, serviceId.split("@")[1])).or();
                        //此处or()无用,lambda自行体会。
            })
    );
}

导致sql的or被and替代。

SELECT basic_rule_snapshot_id FROM alarm_info WHERE (status = ? AND ((basic_rule_snapshot_id = ? AND industry_device_id = ?) AND(basic_rule_snapshot_id = ? AND industry_device_id = ?) AND(basic_rule_snapshot_id = ? AND industry_device_id = ?)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值