当前使用版本(必须填写清楚,否则不予处理)

mybatis-plus-boot-starter 3.3.0

该问题是怎么引起的?(最新版上已修复的会直接close掉)

我理解的这个方法是返回第一条记录(findOne),然后转成另外一个类型,实际上这个方法是返回第一条记录的第一个字段,一般都是ID,然后再转成另外一个类型。 MyBatis-Plus 关于ServiceImpl的getObj方法 MyBatis-Plus 关于ServiceImpl的getObj方法 MyBatis-Plus 关于ServiceImpl的getObj方法 我想知道这个方法为什么要这样设计,一般第一个字段都是ID,还需要转吗。

重现步骤

报错信息

java.lang.ClassCastException: java.lang.Long cannot be cast to com.wenxia.mbpd.entity.User MyBatis-Plus 关于ServiceImpl的getObj方法

Comment From: Phantom0103

图看不到,贴下代码:

    @Override
    public <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
        return SqlHelper.getObject(log, listObjs(queryWrapper, mapper));
    }
    @Override
    public <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
        return baseMapper.selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
    }
    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

Comment From: miemieYaho

本来就是返回第一个字段,有疑问去找mybatis质问,Function 只是把部分获取到的sql类型转成自己要的类型