欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-05 11:07:29
目录lambdaquerywrapper动态加过滤条件 动态lambdamybatis-plus querywrapper lambdaquerywrapperlambdaquerywrapper动态...

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);

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