lambdaQueryWrapper多条件嵌套查询方式

目录
  • lambdaQueryWrapper多条件嵌套查询
    • 表结构如下
    • 下面是根据条件生成的SQL语句
  • LambdaQueryWrapper 常用条件

lambdaQueryWrapper多条件嵌套查询

需求:根据条件获取一段时期内按照年份和周存储的数据

表结构如下

userNetType moduleName cityName subjectCname subjectEname pv uv year week
1 1 江苏省 死神专题 sszt 100 70 2019 51
1 1 江苏省 海贼王专题 hzwzt 200 80 2019 52
1 1 江苏省 火影忍者专题 hyrzzt 300 90 2020 01
/**
     * @param pageNum     当前页
     * @param pageSize    每页条数
     * @param moduleName  产品
     * @param userNetType 运营商
     * @param cityName    城市名称
     * @param beginTime   开始周的任意一天日期(例如:2019-12-20)
     * @param endTime     结束周的任意一天日期(例如:2020-01-20)
     * @param keyWord     查询条件(专题英文名或者中文名)
     * @return
     */
        //开始年份
        String beginYear = null;
        //结束年份
        String endYear = null;
        //开始周数
        String beginWeek = null;
        //结束周数
        String endWeek = null;
        /*这部分内容忽略,调用了其他的方法,
         反正就是为了获取开始日期所在的年份、周数以及结束日期所在的年份、周数*/
        if (StringUtils.isBlank(beginTime) || StringUtils.isBlank(endTime)) {
            DateTime dateTime = DateUtil.lastWeek();
            //格式化日期,结果:yyyyMMdd
            beginTime = DateUtil.formatDate(dateTime);
            beginYear = TimeUtils.getDateOfYearWeek(beginTime).get("year");
            endYear = beginYear;
            beginWeek = TimeUtils.getDateOfYearWeek(beginTime).get("week");
            endWeek = beginWeek;
        } else {
            beginYear = TimeUtils.getDateOfYearWeek(beginTime).get("year");
            endYear = TimeUtils.getDateOfYearWeek(endTime).get("year");
            beginWeek = TimeUtils.getDateOfYearWeek(beginTime).get("week");
            endWeek = TimeUtils.getDateOfYearWeek(endTime).get("week");
        }
        Page<DwSubjectDataInfoWw> page = new Page<>(pageNum, pageSize);
        LambdaQueryWrapper<DwSubjectDataInfoWw> queryWrapper = Wrappers.<DwSubjectDataInfoWw>lambdaQuery();
        if (beginYear.equals(endYear)) {
            queryWrapper.eq(DwSubjectDataInfoWw::getYear, beginYear);
            queryWrapper.between(DwSubjectDataInfoWw::getWeek, beginWeek, endWeek);
        } else {
            //因为Java8 Lambda表达式中最终变量问题,重新赋值一个参数解决
            String year1 = beginYear;
            String year2 = endYear;
            String week1 = beginWeek;
            String week2 = endWeek;
            queryWrapper.and(wrapper -> wrapper.and(wrapper1 -> wrapper1.eq(DwSubjectDataInfoWw::getYear, year1).ge(DwSubjectDataInfoWw::getWeek, week1))
                    .or(wrapper2 -> wrapper2.eq(DwSubjectDataInfoWw::getYear, year2).le(DwSubjectDataInfoWw::getWeek, week2)));
        }
        queryWrapper.orderByDesc(DwSubjectDataInfoWw::getYear);
        queryWrapper.orderByDesc(DwSubjectDataInfoWw::getWeek);
        if (StrUtil.isNotEmpty(cityName)) {
            queryWrapper.eq(DwSubjectDataInfoWw::getCityName, cityName);
        }
        if (StrUtil.isNotEmpty(userNetType)) {
            queryWrapper.eq(DwSubjectDataInfoWw::getUserNetType, userNetType);
        }
        if (StrUtil.isNotEmpty(moduleName)) {
            queryWrapper.eq(DwSubjectDataInfoWw::getModuleName, moduleName);
        }
        //搜索条件可以是专题中文名或英文名
        if (StrUtil.isNotEmpty(keyWord)) {
            queryWrapper.and(wrapper -> wrapper.like(DwSubjectDataInfoWw::getSubjectCname, keyWord).or().like(DwSubjectDataInfoWw::getSubjectEname, keyWord));
        }
        try {
            Page<DwSubjectDataInfoWw> list = dwSubjectDataInfoWwService.page(page, queryWrapper);
            return AjaxResult.success(list);
        } catch (Exception e) {
            logger.error("获取分周专题数据列表错误,错误信息为:", e);
            return AjaxResult.error();
        }

下面是根据条件生成的SQL语句

WHERE
    (
        (
            (year = ? AND week >= ?)
            OR (year = ? AND week <= ?)
        )
        AND city_name = ?
        AND user_net_type = ?
        AND module_name = ?
        AND (
            subject_cname LIKE ?
            OR subject_ename LIKE ?
        )
    )
ORDER BY
    year DESC,
    week DESC

LambdaQueryWrapper 常用条件

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis-Plus实现2种分页方法(QueryWrapper查询分页和SQL查询分页)

    目录 1 MyBatisPlusConfig 2 UserPagination 3 Mapper 3.1 UserMapper.java 3.2 UserMapper.xml 4 Service 4.1 UserService 4.2 UserServiceImpl 5 UserController 6 调试结果 6.1 QueryWrapper查询分页 6.2 SQL查询分页 1 MyBatisPlusConfig MyBatisPlus配置类. package com.config; imp

  • MybatisPlus使用queryWrapper如何实现复杂查询

    目录 使用queryWrapper实现复杂查询 自定义的queryWrapper实现查询 声明提要 核心代码 使用queryWrapper实现复杂查询 // mp实现负责查询操作 @Test public void testSelectQuery(){ //1,创建QueryWrapper对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); // 2,通过QueryWrapper设置条件 // ge大于等于 gt大于 le小于等

  • QueryWrapper中查询的坑及解决

    目录 QueryWrapper中查询的坑 首先,先看代码示例 QueryWrapper的查询方法 QueryWrapper QueryWrapper中查询的坑 首先,先看代码示例 List<Entity> list = testService.list(                     new LambdaQueryWrapper<Entity>()                             .eq(ObjectUtils.isNotEmpty(req.get

  • mybatis-plus QueryWrapper自定义查询条件的实现

    mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/,github上有代码例子,国内小伙伴推荐码云https://gitee.com/baomidou/mybatis-plus.  但是,其中还是有些小坑,文档也没有涉及的很全面,碰到问题,百度或者发issue,能力强的还是直接看源码好,一切答案都在源码中. 版本推荐用3.1.0,3.1.1及以上版本有bu

  • lambdaQueryWrapper多条件嵌套查询方式

    目录 lambdaQueryWrapper多条件嵌套查询 表结构如下 下面是根据条件生成的SQL语句 LambdaQueryWrapper 常用条件 lambdaQueryWrapper多条件嵌套查询 需求:根据条件获取一段时期内按照年份和周存储的数据 表结构如下 userNetType moduleName cityName subjectCname subjectEname pv uv year week 1 1 江苏省 死神专题 sszt 100 70 2019 51 1 1 江苏省 海贼

  • mybatisplus where QueryWrapper加括号嵌套查询方式

    目录 where QueryWrapper加括号嵌套查询 mybatisplus查询语句加括号(.or(),.and()) where QueryWrapper加括号嵌套查询 之前的代码是这个样子的: QueryWrapper<RyxyMemberEntity> wrapper = new QueryWrapper<>();     wrapper.eq("phoneNumber", phone);     if (StringUtils.isEmpty(sce

  • mysql 带多个条件的查询方式

    mysql 带多个条件的查询 环境:mysql 5.7 当一个where语句中同时出现多个and 或者or时,需要将多个OR用小括号括起来再和AND进行"与",或者将多个AND用小括号括起来再与OR进行"或" mysql 多对多条件查询 两个表 user和role 中间表是user_role 查询用户和角色的对应关系 select res.user_name,r.role_name from(select u.user_name,ur.role_id from us

  • Java之Mybatis多层嵌套查询方式

    目录 Mybatis多层嵌套查询 表的存储sql文件 实体类 XML Mybatis多层嵌套查询(多对多) 依赖 实体类Setmeal 实体类CheckGroup 实体类CheckItem mapper层 测试 Mybatis多层嵌套查询 三张表:user article blog 表的存储sql文件 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50620 Source Host

  • laravel多条件查询方法(and,or嵌套查询)

    说明 在日常开发中,经常会需要写多条件的数据库查询语句.在使用框架的情况下,单纯使用原生sql查询会导致结果与model无法对应,也就没有办法使用框架的一些便利的方法对结果集进行处理.尤其是laravel提供了非常多的对查询结果集进行处理的工具.所以最好是使用laravel提供的ORM进行多条件的数据库查询. 问题 比如需要执行这样一条sql语句 select * from homework where (id between 1 and 10 or id between 50 and 70)

  • MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)

    目录 MyBatis一对多的xml配置 嵌套查询 嵌套结果 一对多关联查询xml配置写法 情景概述 创建表 对应javaPojo 查询客户表client获取客户名下的附件信息 查询客户附件表client_file获取附件所属的客户信息 小结一下 MyBatis一对多的xml配置 用的是window上面的画图板,没法以文字的方式展示出来,见谅 嵌套查询 嵌套结果 一对多关联查询xml配置写法 情景概述 1.有一张客户表 Client ,存储客户信息, 姓名 name ,年龄 age等. 2.有一张

  • 使用mongoTemplate实现多条件加分组查询方式

    目录 mongoTemplate实现多条件查询 mongoTemplate分组查询的坑 先来一个常见的错误信息: Due to limitations of the com.mongodb.BasicDocument, you can't add a second '$and' expression specified as '$and : 错误原因: 在一个 Criteria 对象中调用了多次 andOperator() 方法 mongoTemplate实现多条件查询 多个条件的查询只需要创建

  • 详解MySQL子查询(嵌套查询)、联结表、组合查询

    一.子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询. 子查询的作用: 1.进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE子句中对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询. 注意:列必须匹配 --在WHERE子句中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列.通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列. 示例2:返回订购

  • SpringBoot整合ES高级查询方式

    目录 1.配置 2.API操作ES 2.1 查询索引列表 2.2 TermsQuery 2.3 WildcardQuery 2.4 RangeQuery 2.5 MatchQuery 2.6 MultiMatchQuery 2.7 ExistsQuery 2.8 BoolQuery 2.9 排序 2.10 结果字段过滤 2.11 分页 2.22 聚合 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>

  • MySQL中几种常见的嵌套查询详解

    目录 几种常见的嵌套查询——以学员成绩为例 含ANY或ALL关键词的嵌套查询 含IN关键词的嵌套查询 含EXISTS关键词的嵌套查询 [补充]关于IN和EXISTS两个关键词还有两个延伸关键词NOT IN和NOT EXISTS 附:其他使用方法和注意 总结 几种常见的嵌套查询——以学员成绩为例 嵌套查询,也称为子查询,是实际工作中经常用到的一种查询方式.子查询其实就是在已有的查询语句中的where后面再嵌套一层查询语句,也就是把内层查询结果当做外层查询参照的数据表来使用. 在工作中,经常会遇见4

随机推荐