lambdaQueryWrapper多条件嵌套查询方式
更新时间:2022年01月11日 09:28:42 作者:吃苹果配萝卜
这篇文章主要介绍了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 常用条件
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
从前端Vue到后端Spring Boot接收JSON数据的正确姿势(常见错误及问题)
这篇文章主要介绍了从前端Vue到后端Spring Boot接收JSON数据的正确姿势(常见错误及问题),本文将从前端Vue到后端Spring Boot,详细介绍接收JSON数据的正确姿势,帮助开发人员更好地处理JSON数据,感兴趣的朋友一起看看吧2024-02-02实例分析Java中public static void main(String args[])是什么意思
这篇文章主要介绍了实例分析Java中public static void main(String args[])的意义,详细分析了Java主函数main关键字声明的具体含义和用法,需要的朋友可以参考下2015-12-12通过Spring Boot配置动态数据源访问多个数据库的实现代码
这篇文章主要介绍了通过Spring Boot配置动态数据源访问多个数据库的实现代码,需要的朋友可以参考下2018-03-03IDEA Ultimate2020.2版本配置Tomcat详细教程
这篇文章主要介绍了IDEA Ultimate2020.2版本配置Tomcat教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09request.getParameter()方法的简单理解与运用方式
在JavaWeb开发中,request对象扮演着至关重要的角色,它是HTTP请求的封装,request.getParameter()用于获取客户端通过GET或POST方式发送的参数,与之相对,request.setAttribute()用于在服务器端设置属性,这些属性只在一次请求中有效2024-10-10
最新评论