MyBatisPlus 查询selectOne方法

一次偶然间遇到的一个问题,MyBatisPlus 自带selectOne代码中查询出来了一条数据,但是在数据库中查出来了多条数据,而代码中也没有报错!好奇之下看了源码才恍然大悟。

public SysFileTemplate findPathByTableName(String tableName) {
          
   
		EntityWrapper<SysFileTemplate> wrapper = new EntityWrapper<>();
		wrapper.eq("table_name", tableName);
		wrapper.ne("status", BizCode.Status.DELETE);
		SysFileTemplate selectOne = selectOne(wrapper);
		return selectOne;
	}

以下是mybatisPlus的源码,可以看出selectOne方法也是调用了selectList方法。在看getObject方法,如果selectList方法获取的值大于1时,只是发出一个警告消息 Warn: execute Method There are 2 results.,之后取第一条消息返回去,所以selectOne方法得到的就是一条消息(null值除外)

@Override
public T selectOne(Wrapper<T> wrapper) {
          
   
    return SqlHelper.getObject(baseMapper.selectList(wrapper));
}
/**
     * <p>
     * 从list中取第一条数据返回对应List中泛型的单个结果
     * </p>
     *
     * @param list
     * @param <E>
     * @return
     */
    public static <E> E getObject(List<E> list) {
          
   
        if (CollectionUtils.isNotEmpty(list)) {
          
   
            int size = list.size();
            if (size > 1) {
          
   
                logger.warn(String.format("Warn: execute Method There are  %s results.", size));
            }
            return list.get(0);
        }
        return null;
    }

特别注意: 1、如果需要将selectOne的返回值传递进行操作的话,必须考虑可能的返回null的情况,否则程序就会异常。

经验分享 程序员 微信小程序 职场和发展