【mybatis-plus的LambdaQueryWrapper中and、or的用法 】在 for循环中使用 or

【LambdaQueryWrapper的or用法】

错误写法一:

//【 错误写法1: 打印的sql中or拼接没有加括号:SELECT COUNT( * ) FROM pm_project WHERE `del_flag` = 0 AND
// ( id = 287 AND `project_status` = '1' OR `project_status` = '2' OR `project_status` = '3' OR `project_status` = '4' AND `del_flag` = '0' );
//          LambdaQueryWrapper<PmProject> lqw = Wrappers.lambdaQuery();
//          lqw.eq(PmProject::getId,id)
//             .eq(PmProject::getProjectStatus, '1').or()
//             .eq(PmProject::getProjectStatus, '2').or()
//             .eq(PmProject::getProjectStatus, '3').or()
//             .eq(PmProject::getProjectStatus, '4')
//             .eq(PmProject::getDelFlag, '0');

【控制台sql打印:】

在这里插入图片描述

-- 错误写法一:1、通过id能找到一条未被删除(`del_flag`=0)的数据
SELECT
	id,
	`project_code`,
	`project_name`,
	`project_status`,
	`project_type_code`,
	`start_time`,
	`end_time`,
	`del_flag`,
	`creator_id`,
	`modifier_id`,
	create_time,
	update_time,
	`delay_end_time` 
FROM
	pm_project 
WHERE
	id = 287 
	AND `del_flag` = 0;
	
	-- 2、COUNT = 19
SELECT
	COUNT( * ) 
FROM
	pm_project 
WHERE
	`del_flag` = 0 
	AND ( id = 287 AND `project_status` = '1' OR `project_status` = '2' 
	OR `project_status` = '3' OR `project_status` = '4' AND `del_flag` = '0' );

错误写法二:

//  错误写法2:
//          LambdaQueryWrapper<PmProject> lqw = Wrappers.lambdaQuery();
//          lqw.and(wq -> wq
//             .eq(PmProject::getId,id)
//             .eq(PmProject::getProjectStatus, '1').or()
//             .eq(PmProject::getProjectStatus, '2').or()
//             .eq(PmProject::getProjectStatus, '3').or()
//             .eq(PmProject::getProjectStatus, '4')
//             .eq(PmProject::getDelFlag, '0'));

在这里插入图片描述

-- 错误写法二:1、通过id能找到一条未被删除(`del_flag`=0)的数据
SELECT id,`project_code`,`project_name`,`project_status`,`project_type_code`,`start_time`,`end_time`,`del_flag`,`creator_id`,`modifier_id`,create_time,update_time,`delay_end_time`
 FROM pm_project
 WHERE id=287 AND `del_flag`=0;
 	-- 2、COUNT = 19
 SELECT COUNT( * )
 FROM pm_project
 WHERE `del_flag`=0 AND ((id = 287 AND `project_status` = '1' OR 
 `project_status` = '2' OR `project_status` = '3' OR `project_status` = '4' AND `del_flag` = '0'));
 
-- 上面的sql里写了id = 287 竟然还能查出19条数据,说明where id = 287 没有生效。原因: AND ((id = 287 AND `project_status` = '1' OR `project_status` = '2'
-- 拼接短路需要把id放外面,把里面所有的or用括号括起来
-- ;下面的sql可以使之生效,查出一条数据
		
-- COUNT = 1
SELECT
	COUNT( * ) 
FROM
	pm_project 
WHERE
	id = 287

正确写法:

         LambdaQueryWrapper<PmProject> lqw = Wrappers.lambdaQuery();
            lqw.eq(PmProject::getId,id);
            lqw.and(wq -> wq
               .eq(PmProject::getProjectStatus, '1').or()
               .eq(PmProject::getProjectStatus, '2').or()
               .eq(PmProject::getProjectStatus, '3').or()
               .eq(PmProject::getProjectStatus, '4')
               .eq(PmProject::getDelFlag, '0'));
if (baseMapper.selectCount(lqw) > 0)
   throw new CustomException("项目不是未开始状态,无法删除!");

在这里插入图片描述
在这里插入图片描述

 -- 正确写法 1、通过id能找到一条未被删除(`del_flag`=0)的数据
SELECT
	id,
	`project_code`,
	`project_name`,
	`project_status`,
	`project_type_code`,
	`start_time`,
	`end_time`,
	`del_flag`,
	`creator_id`,
	`modifier_id`,
	create_time,
	update_time,
	`delay_end_time` 
FROM
	pm_project 
WHERE
	id = 287 
	AND `del_flag` = 0;
	
	
-- 	2找不到状态为1234的项目,故可以删除
SELECT
	COUNT( * ) 
FROM
	pm_project 
WHERE
	`del_flag` = 0 
	AND (
		id = 287 
	AND ( `project_status` = '1' OR `project_status` = '2' OR
	 `project_status` = '3' OR `project_status` = '4' AND `del_flag` = '0' ));

删除项目时校验的最终正确写法:

    @Override
   @Transactional
   public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
      if(isValid){
         //TODO 做一些业务上的校验,判断是否需要校验
         ids.stream().forEach(id->{
            if (baseMapper.selectById(id)==null) {
               throw new CustomException("项目基础信息不存在");
            }

            LambdaQueryWrapper<PmProject> lqw = Wrappers.lambdaQuery();
            lqw.eq(PmProject::getId,id);
            lqw.and(wq -> wq
               .eq(PmProject::getProjectStatus, '1').or()
               .eq(PmProject::getProjectStatus, '2').or()
               .eq(PmProject::getProjectStatus, '3').or()
               .eq(PmProject::getProjectStatus, '4')
               .eq(PmProject::getDelFlag, '0'));

            if (baseMapper.selectCount(lqw) > 0)
               throw new CustomException("项目不是未开始状态,无法删除!");
         });
      }
      return removeByIds(ids);
   }

and、or的用法

// WHERE xxxx!=id And ( xxxx=ANo or xxxx=BNo)
            LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.ne(Project::getId,project.getId());
            queryWrapper.and((wrapper)->{
                wrapper.eq(Project::getANo,project.getBillNo())
                        .or().eq(Project::getBNo,project.getBillNo());
            });
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus是一个Java持久层框架,它在MyBatis的基础上提供了更加便捷和强大的功能。LambdaQueryWrapperMyBatis-Plus的一个查询条件构造器,它可以通过Lambda表达式来编写查询条件,使得代码更加简洁和易读。 使用LambdaQueryWrapper可以按照以下步骤进行: 1. 导入相关的依赖:在项目的pom.xml文件添加MyBatis-Plus的依赖。 2. 创建LambdaQueryWrapper对象:通过LambdaQueryWrapper的构造方法创建一个查询条件构造器对象。 3. 编写查询条件:使用LambdaQueryWrapper对象的方法来编写查询条件。可以使用Lambda表达式来指定查询字段、条件和关联关系等。 4. 执行查询操作:调用MyBatis-Plus提供的相应方法执行查询操作,如selectList、selectOne等。 下面是一个简单的示例代码,演示如何使用LambdaQueryWrapper进行查询: ```java import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; importimport com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getUserListByAge(int age) { LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(User::getAge, age); return userMapper.selectList(queryWrapper); } } ``` 在上面的代码,我们首先导入了LambdaQueryWrapperWrappers类。然后,在getUserListByAge方法,我们创建了一个LambdaQueryWrapper对象queryWrapper,并使用eq方法指定了查询条件,即查询年龄等于指定值的用户记录。最后,调用userMapper的selectList方法执行查询操作,并返回查询结果。 这只是LambdaQueryWrapper的一个简单示例,你可以根据实际需求使用其他方法和条件来编写更复杂的查询条件。同时,MyBatis-Plus还提供了很多其他的功能和特性,你可以查阅官方文档来了解更多详情。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值