mybatis

您所在的位置:网站首页 怎样查明细不能被删除的记录 mybatis

mybatis

2023-12-02 18:27| 来源: 网络整理| 查看: 265

业务场景:有些情况的时候,我们查询某个地方引用的数据被“软删除”了,mybatis-plus直接的api无法帮我查询出来,但是我又不想手写sql,只想使用 条件构造器。

场景:假如我们的mysql表逻辑删除字段是 is_delete,直接使用myabtis-plus的api他会自动帮我们拼上 is_delete=0, 这是写死的固定查询条件,当我们使用条件构造器的时候,它都会去带上这个固定条件,导致我们想要查询被“软删除的”数据,只能通过手写sql的方式。

其实,条件构造器也是可以查询出来的,来看我的骚操作(不推荐),还是尽量用xml吧。

这里写目录标题 一、问题描述二、解决方法2.1 方法一:通过条件构造器(小聪明,不推荐)2.1.1 写法一运行sql截图2.1.2写法二运行sql截图 2.2 方法二:通过xml(推荐) 三、注意!

一、问题描述

什么都不写的时候,直接使用mybatis-plu的条件构造器queryWrapper的话会自动拼上逻辑删除的字段,如图: 在这里插入图片描述 这样的话大部分情况是满足我的需求的(不然我也不会使用逻辑删除@TableLogic了),但是,我有些情况下,我就是需要把逻辑删除的数据也查询出来,下面有几种解决办法。

二、解决方法 2.1 方法一:通过条件构造器(小聪明,不推荐)

(此写法有风险,需要注意mybaits-plus-starter的版本)

测试版本:3.1.0 可用此写法 测试版本:3.3.1 不能使用该写法

@Override public TyqUser getUserById(String id) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); // 写法1: // queryWrapper.eq(TyqUser::getId, id); // queryWrapper.or().eq(TyqUser::getId, id); // 写法2: // queryWrapper.apply("id = {0} or deleted = 1 and id = {0}", id); // 写法3:使用@Select("select * from user where id = #{}"),等同于写法4 // 写法4:使用 xml ,将上方语句写到 标签中 TyqUser user = baseMapper.selectOne(queryWrapper); return user; } 2.1.1 写法一运行sql截图

在这里插入图片描述

2.1.2写法二运行sql截图

在这里插入图片描述

2.2 方法二:通过xml(推荐) select * from `user` where id = #{id} 三、注意!

上述方法一,方法二的本质是博主发现了or后面不会自动拼接逻辑删除=true的字段,但是mybatis-plus的版本是3.3.1的时候,会出现《小聪明》失效场景。

com.baomidou mybatis-plus-boot-starter 3.3.1

写法一sql结果,失效,查询不出来,因为拼接的条件被()括起来了,始终都会加上deleted=0的条件! 在这里插入图片描述 写法二sql结果,失效,查询不出来,因为拼接的条件被()括起来了,始终都会加上deleted=0的条件! 在这里插入图片描述

注意:方法一,方法二是否有效,是跟myabtis-plus的版本有关的!稳妥起见还是直接写在xml中吧,通过耍小聪明偷懒都是会付出代价的,版本变动以后直接炸裂。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3