使用LambdaQueryWrapper动态加过滤条件 动态Lambda

目录
  • LambdaQueryWrapper动态加过滤条件 动态Lambda
  • mybatis-plus QueryWrapper LambdaQueryWrapper

LambdaQueryWrapper动态加过滤条件 动态Lambda

1、遇到这样的需求,在baseservice类中处理数据权限,子类可能使用QueryWrapper或者LambdaQueryWrapper调用base类的方法进行查询。

2、可以拿到的:PO的类,数据权限属性的属性名(是固定的)

直接上代码:

  /**
     * 可序列化
     */
    private static final int FLAG_SERIALIZABLE = 1;
//获取当前登录人权限
 Integer secretLevel = getUserSecretLevel();
        if(secretLevel!=null){
            SFunction func = null;
            final MethodHandles.Lookup lookup = MethodHandles.lookup();
            //po的返回Integer的一个方法
            MethodType methodType = MethodType.methodType(Integer.class, entityClass);
            final CallSite site;
            try {
                //方法名叫做:getSecretLevel  转换为 SFunction function interface对象
                site = LambdaMetafactory.altMetafactory(lookup,
                        "invoke",
                        MethodType.methodType(SFunction.class),
                        methodType,
                        lookup.findVirtual(entityClass, "getSecretLevel", MethodType.methodType(Integer.class)),
                        methodType,FLAG_SERIALIZABLE);
                func = (SFunction) site.getTarget().invokeExact();
                //数据小于这个级别的都查出来
                queryWrapper.le(func,secretLevel);
            } catch (Throwable e) {
                log.error("获取getSecretLevel方法错误",e);
            }
        }

mybatis-plus QueryWrapper LambdaQueryWrapper

ContractTemplate::getTemplateCode 转为对应的字段

LambdaQueryWrapper<SomeClass> objectLambdaQueryWrapper = Wrappers.lambdaQuery();
        objectLambdaQueryWrapper.eq(searchDto.getTemplateCode() != null, ContractTemplate::getTemplateCode, searchDto.getTemplateCode());

        IPage<SomeClass> page = page(MybatisPlusUtil.setPageParams(pageNo, pageSize), objectLambdaQueryWrapper);
      return page

QueryWrapper

QueryWrapper<SomeClass> queryWrapper = Wrappers.query();
        queryWrapper.eq(searchDto.getTemplateCode() != null, TemplateConst.COL_TEMPLATE_CODE, searchDto.getTemplateCode())
                .ge(searchDto.getStartDate() != null, TemplateConst.COL_CREATE_TIME, searchDto.getStartDate())
                .lt(searchDto.getEndDate() != null, TemplateConst.COL_CREATE_TIME, DateUtils.addDays(searchDto.getEndDate(), 1))
                .eq(searchDto.getContractCategoryId() != null, TemplateConst.COL_CATEGORY_ID, searchDto.getContractCategoryId())
                .and(i -> i.like(TemplateConst.COL_TEMPLATE_NAME, searchDto.getKeyword()).or().like(TemplateConst.COL_DESCRIPTION, searchDto.getKeyword()))
                .eq(searchDto.getIs_enabled() != null, TemplateConst.COL_IS_ENABLED, searchDto.getIs_enabled())
                // 未标志删除的数据
                .eq(CommonConst.DBColName.DEL_FLAG, CommonConst.IsEnabled.ENABLED.getCode())
                .orderByDesc(TemplateConst.COL_CREATE_TIME)
                ;
        IPage<ContractTemplate> page = page(MybatisPlusUtil.setPageParams(pageNo, pageSize), queryWrapper);
        return MybatisPlusUtil.parsePageDTO(page);

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

(0)

相关推荐

  • LambdaQueryWrapper的实现原理分析和lambda的序列化问题

    目录 LambdaQueryWrapper的实现原理 SFunction 类 LambdaUtils SerializedLambda 思考 对象序列化中的 writeReplace 和 readResolve 具体示例如下 LambdaQueryWrapper的实现原理 mybatis-plus的LambdaQueryWrapper的lambda来组合查询字段的功能十分好用,但是它是如何实现的呢? 通过查看mybatis的源码发现它的功能主要是四个类来实现的. 我将其copy下来分析下. SF

  • 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

  • mybatis plus条件构造器queryWrapper、updateWrapper

    注明:上篇文章介绍了springboot+mybatis-plus通用CRUD的用法,这篇文章我们来介绍一下mybatis-plus强大的条件构造器.mybatis-plus的版本为最新版3.0.3 .条件构造器咱们讲述queryWrapper和updateWrapper的用法.关系.以及强大之处. 首先在这里写下官方文档的链接位置,官方文档说的很详细.如果还想知道在项目中的具体用法请往下看. 一.条件构造器关系介绍 介绍 : 1.上图绿色框为抽象类abstract 2.蓝色框为正常class类

  • MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决

    目录 LambdaQueryWrapper使用 int默认值问题 问题现象 解决方法 问题分析 小结一下 lambdaquerywrapper in使用样例 直接使用列名报错 下面这样ok LambdaQueryWrapper使用 int默认值问题 问题现象 一顿操作,感觉不可能有问题,调试后发现,没传任何参数,日志里面居然有两个参数, 进入对象中发现 解决方法 int类型替换成 Integer 类型 问题消失 问题分析 1.了解一下int int: int 数据类型是32位.有符号的以二进制补

  • Mybatis-Plus 条件构造器 QueryWrapper 的基本用法

    前言 记录下Mybatis-Plus中条件构造器Wrapper 的一些基本用法. 查询示例 表结构 CREATE TABLE `product` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)

  • 使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    目录 LambdaQueryWrapper动态加过滤条件 动态Lambda mybatis-plus QueryWrapper LambdaQueryWrapper LambdaQueryWrapper动态加过滤条件 动态Lambda 1.遇到这样的需求,在baseservice类中处理数据权限,子类可能使用QueryWrapper或者LambdaQueryWrapper调用base类的方法进行查询. 2.可以拿到的:PO的类,数据权限属性的属性名(是固定的) 直接上代码: /** * 可序列化

  • 解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题

    Vue使用swiper插件时特别是轮播元素含有动态数据时可能会出现数据为空或者白屏的问题 使用下面的方法可以解决(保证在数据请求之后再渲染页面) 页面结构 <div class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide tpOne" v-if="topInfo"> <-- 此处为绑

  • Android 动态加载 so实现示例详解

    目录 背景 so动态加载介绍 从一个例子出发 so库检索与删除 动态加载so 结束了吗? ELF文件 扩展 总结 背景 对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了. 但是很遗憾,许多公司都还没有这方面的涉略又或者说不知

  • C#动态加载组件后如何在开发环境中调试详解

    动态加载组件 那就是简单的Assembly.Load动态加载dll而以.这网上资料也有不少.基本的思路基本上就是在本地上一个指定目录如[plugs]存在着一堆dll文件.主程序在初始运行时一般会把指定目录下的dll一次性用Assembly.Load加载进来.只要把指定目录变成从网络加载,或者加载指定目录前先检查网络上的是否有新版本.这就简单做成个最简单版本的热更新. 多数网上的资料就是然后就没有然后了.很多人就发现产品是通过动态加载组件了.但开发人员根本无法调试啊.不能调试就意味着开发难度大啊.

  • DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 主要功能 分页,即时搜索和排序 几乎支持任何数据源:DOM, javascript, Ajax 和 服务器处理 支持不同主题 DataTables, jQuery UI, Bootstrap, Foundation 各式各样的扩展: Editor, TableTools, FixedColumns -- 丰富多样的option和强大的API 支持国际化 超过2900+个单元测试 免

  • Vue动态加载图片在跨域时无法显示的问题及解决方法

    写在前面 小记,就简单写了 .问题:VUE开发时因为要访问后端的接口所以要配置请求转发,如果直接转发全部请求,那么VUE动态绑定的src也会转发到后端,因为图片在前端,所以会收到404 NOT FOUND的报错. 常规的请求转发 在vue-cli3内,直接编辑vue.config.js,如下: let proxyObj={}; proxyObj['/']={ ws:false, target:'http://localhost:8023',//后端地址 changeOrigin:true, pa

  • 动态加载css方法实现和深入解析

    一.方法引用来源和应用 此动态加载css方法 loadCss,剥离自Sea.js,并做了进一步的优化(优化代码后续会进行分析). 因为公司项目需要用到懒加载来提高网站加载速度,所以将非首屏渲染必需的css文件进行动态加载操作. 二.优化后的完整代码 /* * @function 动态加载css文件 * @param {string} options.url -- css资源路径 * @param {function} options.callback -- 加载后回调函数 * @param {s

  • js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空间,到底部时,会动态加载剩余的说说或者是日志 今天我们就来看看他们的实现思路和js控制动态加载的代码 下面的代码主要是控制滚动条下拉时的加载事件的 在下面代码说明出,写上你的操作即可,无论是加载图片还是加载记录数据  都可以 别忘了引用jquery类库 $(window).scroll(functi

  • 动态加载JavaScript文件的两种方法

    这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval()实施代码.第二种是,动静创建一个script标签,配置其src属性,经过把script标签插入到页面head来加载js,相当于正在head中写了一个<script src="..."></script>,只可是这个script标签是用js动静创建的 比喻说是我们

  • 详谈LABJS按需动态加载js文件

    LABjs 是一个很小的 JavaScript 工具,用来根据需要加载 JavaScript 文件,通过使用该工具可以提升页面的性能,避免加载不需用到的 JavaScript 文件,可以实现动态并行加载脚本文件,以及管理加载脚本文件的执行顺序. 简单示例 $LAB .script("script1.js", "script2.js", "script3.js") .block(function(){ // wait for all to load

随机推荐