mybatis-plus查询已经逻辑删除的数据

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

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

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

一、问题描述

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

二、解决方法

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

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

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


    @Override
    public TyqUser getUserById(String id) {
    
    
        LambdaQueryWrapper<TyqUser> queryWrapper = Wrappers.<TyqUser>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 ,将上方语句写到 <select> 标签中
        TyqUser user = baseMapper.selectOne(queryWrapper);
        return user;
    }

2.1.1 写法一运行sql截图

在这里插入图片描述

2.1.2写法二运行sql截图

在这里插入图片描述

2.2 方法二:通过xml(推荐)

    <select id="getByIdXml" resultType="com.lzq.learn.domain.TyqUser">
        select * from `user` where id = #{
    
    id}
    </select>

三、注意!

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

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
<!--            <version>3.1.0</version>-->
        </dependency>

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

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

猜你喜欢

转载自blog.csdn.net/lzq2357639195/article/details/132183298