LambdaQueryWrapper动态加过滤条件 动态Lambda(首发)

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

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

   直接上代码:

public static SFunction getSFunction(Class<?> entityClass, String fieldName) {
        if (functionMap.containsKey(entityClass.getName() + fieldName)) {
            return functionMap.get(entityClass.getName() + fieldName);
        }
        Field field = getDeclaredField(entityClass, fieldName);
        if(field == null){
            throw ExceptionUtils.mpe("This class %s is not have field %s ", entityClass.getName(), fieldName);
        }
        SFunction func = null;
        final MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType methodType = MethodType.methodType(field.getType(), entityClass);
        final CallSite site;
        String getFunName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
        try {
            site = LambdaMetafactory.altMetafactory(lookup,
                    "invoke",
                    MethodType.methodType(SFunction.class),
                    methodType,
                    lookup.findVirtual(entityClass, getFunName, MethodType.methodType(field.getType())),
                    methodType, FLAG_SERIALIZABLE);
            func = (SFunction) site.getTarget().invokeExact();
            functionMap.put(entityClass.getName() + field, func);
            return func;
        } catch (Throwable e) {
            throw ExceptionUtils.mpe("This class %s is not have method %s ", entityClass.getName(), getFunName);
        }
    }

     

### 回答1: lambdaquerywrapper是一个开源的Java工具包,提供了一种更简便和易用的方式来构建和执行数据库查询语句。它的主要特点包括灵活性、可扩展性和效率高。 在使用lambdaquerywrapper中进行条件查询时,我们可以使用lambda表达式来构建查询条件。比如,我们可以使用lambda表达式来指定查询条件的字段和值,以及使用and或or运算符连接多个查询条件。 另外,lambdaquerywrapper还提供了一些方便的方法来简化查询操作。比如,我们可以使用eq()方法来指定等于查询条件,使用like()方法来模糊查询,使用in()方法来指定范围查询等等。 使用lambdaquerywrapper进行条件查询时,我们需要注意选择合适的查询方法和运算符,以及避免查询条件过于复杂和庞大,从而影响查询效率。同时,我们需要熟悉自己所使用的数据库类型和版本,以确保查询条件的兼容性和正确性。 总的来说,使用lambdaquerywrapper进行条件查询可以有效地提高查询效率和开发效率,尤其适用于对于复杂数据结构和大规模数据的查询和分析。 ### 回答2: LambdaQueryWrapper是MyBatis-Plus提供的一个查询条件封装器,可以让我们更方便地使MyBatis-Plus的Lambda表达式实现SQL查询。 LambdaQueryWrapper可以用于多种不同的过滤条件,包括等于、不等于、大于、小于、等等。这些过滤条件可以根据我们的实际需求进行组合,形成复杂的查询条件LambdaQueryWrapper具有非常高的灵活性和扩展性。通过Lambda表达式,我们可以方便地编写出复杂的查询条件。例如,我们可以根据多个条件进行组合查询,还可以对查询条件进行排序,以及分组查询。 LambdaQueryWrapper在使用时还需要注意一些细节问题。例如,我们需要使用select和from来指定我们要查询的表,同时还需要使用lambda表达式来指定查询条件。我们还可以使用LambdaQueryWrapper的各种方法,如eq(等于)、ne(不等于)、ge(大于等于)、gt(大于)、le(小于等于)、lt(小于)、between(区间)等来添查询条件。 总之,LambdaQueryWrapper是一个非常强大的查询条件封装器,可以方便地完成MyBatis-Plus的Lambda表达式实现SQL查询。使用LambdaQueryWrapper可以大大提高我们的开发效率,并减少出错的可能性。 ### 回答3: Lambda QueryWrapper是Mybatis-plus提供的一种灵活且方便的条件查询方式,它可以通过lambda表达式来构建查询条件,使用起来非常简单。下面我们来详细讲解一下Lambda QueryWrapper条件查询。 Lambda QueryWrapper的基本操作: 1. 创建QueryWrapper对象 创建QueryWrapper对象的方式有两种,一种是直接new QueryWrapper(),另一种是使用QueryWrapper.lambda()静态方法,可以直接在lambda表达式中构建查询条件。 2. 等值查询 等值查询是最为基本的查询操作,使用eq方法可以构建等值查询条件。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", "张三"); 这段代码表示查询username等于“张三”的User对象。 3. 模糊查询 模糊查询常用于模糊匹配字符串,使用like方法可以构建模糊查询条件。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("username", "张"); 这段代码表示查询username包含“张”字的User对象。 4. 范围查询 范围查询可以查询某个参数在一定范围内的记录,使用between方法可以构建范围查询条件。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.between("age", 20, 30); 这段代码表示查询年龄在20到30岁之间的User对象。 5. 排序查询 排序查询可以对查询结果按照某一字段进行排序,使用orderByAsc和orderByDesc方法可以构建排序查询条件。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.orderByAsc("age"); 这段代码表示按照年龄升序排列查询结果。 Lambda QueryWrapper的高级操作: 1. 子查询 子查询可以在查询结果中嵌入另一个查询,使用nested方法可以构建子查询条件。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.nested(qw -> qw.eq("username", "张三").or().eq("username", "李四")); 这段代码表示查询username等于“张三”或者“李四”的User对象。 2. 条件组合 条件组合可以通过and和or方法将多个查询条件进行组合,使用嵌套Lambda表达式也可以构建更为复杂的条件组合。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("gender", "男").and(qw -> qw.between("age", 20, 30).or().between("age", 40, 50)); 这段代码表示查询性别为“男”,且年龄在20到30岁或40到50岁之间的User对象。 3. lambda表达式 lambda表达式是Lambda QueryWrapper的重要特性,它可以通过Lambda表达式的方式对查询条件进行构建,使用方法极为简洁。例如: QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(User::getUsername, "张三").or().eq(User::getUsername, "李四"); 这段代码使用lambda表达式查询username等于“张三”或者“李四”的User对象。 Lambda QueryWrapper作为Mybatis-plus的强大查询工具,几乎可以满足所有复杂的条件查询需求,学习并掌握Lambda QueryWrapper对于提高开发效率和代码质量非常有帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值