lambdaQueryWrapper多条件嵌套查询方式

 更新时间:2022年01月11日 09:28:42   作者:吃苹果配萝卜  
这篇文章主要介绍了lambdaQueryWrapper多条件嵌套查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。

lambdaQueryWrapper多条件嵌套查询

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

表结构如下

userNetTypemoduleNamecityNamesubjectCnamesubjectEnamepvuvyearweek
11江苏省死神专题sszt10070201951
11江苏省海贼王专题hzwzt20080201952
11江苏省火影忍者专题hyrzzt30090202001
/**
     * @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 常用条件

LambdaQueryWrapper 常用条件

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

相关文章

  • Java中调用DLL动态库的操作方法

    Java中调用DLL动态库的操作方法

    在Java编程中,有时我们需要调用本地代码库,特别是Windows平台上的DLL(动态链接库),本文中,我们将详细讨论如何在Java中加载和调用DLL动态库,并通过具体示例来展示这个过程,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • 使用Scala生成随机数的方法示例

    使用Scala生成随机数的方法示例

    这篇文章主要介绍了使用Scala生成随机数的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • SpringBoot Mybatis 配置文件形式详解

    SpringBoot Mybatis 配置文件形式详解

    这篇文章主要介绍了SpringBoot Mybatis 配置文件形式详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • java实现登录验证码

    java实现登录验证码

    这篇文章主要为大家详细介绍了java实现登录验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java基础之创建虚拟机对象的过程详细总结

    Java基础之创建虚拟机对象的过程详细总结

    本文基于虚拟机HotSpot和常用的内存区域Java堆深入对象分配、布局和访问的全过程,文中有非常详细的图文解说,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • spring中的懒加载详细解读

    spring中的懒加载详细解读

    这篇文章主要介绍了spring中的懒加载详细解读,如果某个Bean再程序运行周期中都可能不会被适用,那么可以设定该Bean为懒加载,优势是尽量节省了服务器的资源,缺点是可能会导致某个相应的时间增加,需要的朋友可以参考下
    2023-10-10
  • Java HashMap的工作原理

    Java HashMap的工作原理

    这篇文章主要介绍了Java HashMap的工作原理的相关资料,需要的朋友可以参考下
    2016-03-03
  • springboot全局异常处理详解

    springboot全局异常处理详解

    本篇文章主要介绍了springboot全局异常处理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 聊聊Java中是什么方法导致的线程阻塞

    聊聊Java中是什么方法导致的线程阻塞

    这篇文章主要介绍了聊聊Java中是什么方法导致的线程阻塞,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Spring Security代码实现JWT接口权限授予与校验功能

    Spring Security代码实现JWT接口权限授予与校验功能

    本文给大家介绍Spring Security代码实现JWT接口权限授予与校验功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-12-12

最新评论