使用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);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
