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 = ?)))

MyBatisPlus是一个Java持久化框架,它提供了一些方法和工具来帮助实现复杂查询。其中,QueryWrapper是一个条件构造器,可以用于构建复杂查询条件。通过使用QueryWrapper,可以实现各种条件组合和筛选。 QueryWrapper中的一些常用方法包括: 1. ge、gt、le、lt、isNull、isNotNull:用于比较字段的大小关系或判断字段是否为null。 2. eq、ne:用于判断字段是否等于或不等于指定的值。 3. between、notBetween:用于判断字段是否在指定的范围内。 4. allEq:用于判断多个字段是否都等于指定的值。 5. like、notLike、likeLeft、likeRight:用于模糊查询,判断字段是否包含指定的字符串。 6. in、notIn、inSql、notinSql、exists、notExists:用于判断字段是否在指定的集合中或者通过子查询的方式进行判断。 7. orand:用于构建多个条件之间的逻辑关系。 8. orderBy、orderByDesc、orderByAsc:用于指定查询结果的排序方式。 9. last:用于追加自定义的SQL语句。 10. 指定要查询的列:可以通过select方法指定查询的列。 11. set、setSql:用于更新操作,设置更新的字段及值。 通过组合使用这些方法,可以构建出复杂查询条件,满足不同的查询需求。具体的使用方法可以参考MyBatisPlus的官方文档或源码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [9. MyBatisPlus实现复杂查询](https://blog.youkuaiyun.com/weixin_45267102/article/details/109142346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [MybatisPlus较全常用复杂查询引例(limit、orderby、groupby、having、like...)](https://blog.youkuaiyun.com/FHlang/article/details/111053977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值