mybatis-plus的listObjs方法返回指定字段的集合

mybatis-plus的listObjs方法返回指定字段的集合

使用listObjs

示例代码

返回字符串的集合

 LambdaQueryWrapper<AdSensitive> query = new LambdaQueryWrapper<AdSensitive>()
                    .select(AdSensitive::getSensitives);
            //记忆
            List<String> words = adSensitiveService.listObjs(query, Object::toString);

mybatis-plus的listObjs()源码

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @param mapper       转换函数
     */
    default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
        return getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
    }

注意Function的泛型,要么是Object,要不就是Object的父类,所有入参一定是Object

    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

限定listObjs的wrapper只能返回一个字段,且返回类型指定为Object

实际应用

返回Long类型的集合

 List<Long> ids = this.listObjs(
                new LambdaQueryWrapper<AdUser>()
                        .select(AdUser::getId)
                        .eq(AdUser::getStatus, 1), o -> Long.valueOf(o.toString()));

因为function的入参只能是Object类型,所有参数只能调用Object的toString方法转成字符串,再调用Long的valueOf方法转成Long类型

mybatis-plus的listObjs()原理演示

    /**
     * mybatis-plus的listObjs()原理演示
     */
    @Test
    public void test2(){
        List<Dto> list = new ArrayList<>();
        Dto d1 = new Dto();
        d1.setId(1);
        d1.setName("java");
        list.add(d1);
        Dto d2 = new Dto();
        d2.setName("php");
        list.add(d2);

        //相当于getBaseMapper().selectObjs(queryWrapper),
        // 从数据源中查询id的集合,类型用Object,而不再用LambdaQueryWrapper中的泛型接收了
        //select id from table;
        List<Object> objects = list
                .stream()
                .map(Dto::getId)
                .collect(Collectors.toList());

        List<Integer> collect = objects
                .stream()
                .filter(Objects::nonNull)
                //因为元素是Object,所以只能调用Object的方法
                .map(o->Integer.valueOf(o.toString()))
                .collect(Collectors.toList());
        System.out.println(collect);
        //[1]
    }

参考资料地址1: MybatisPlus:泛型方法使用 default <V> List<V> listObjs(Function<? super Object, V> mapper)

posted @ 2022-08-19 23:13  进击的小蔡鸟  阅读(6837)  评论(0编辑  收藏  举报