使用LambdaQueryWrapper动态加过滤条件 动态Lambda
作者:陕西小伙伴网络科技有限公司
这篇文章主要介绍了使用LambdaQueryWrapper动态加过滤条件 动态Lambda,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
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);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。