Parcourir la source

Revert "update 优化 重写selectOne方法 自动拼接limit 1"

This reverts commit c73d3cdf890461c2db8c69a89608e1724b4dc92d.
疯狂的狮子Li il y a 10 mois
Parent
commit
f6ddae57c4

+ 28 - 43
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java

@@ -6,21 +6,20 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils;
+import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.toolkit.Db;
-import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
 import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StreamUtils;
 
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 自定义 Mapper 接口, 实现 自定义扩展
@@ -36,21 +35,25 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
     Log log = LogFactory.getLog(BaseMapperPlus.class);
 
     /**
-     * 获取当前实例对象关联的泛型类型 V 的 Class 对象
+     * 获取当前类的泛型类型 V 的 Class 对象
+     * <p>
+     * 该方法使用反射机制从当前类(继承自 BaseMapperPlus 类)的泛型参数中获取第一个泛型类型 V 的 Class 对象
      *
-     * @return 返回当前实例对象关联的泛型类型 V 的 Class 对象
+     * @return 当前类的泛型类型 V 的 Class 对象
      */
     default Class<V> currentVoClass() {
-        return (Class<V>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[1];
+        return (Class<V>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1);
     }
 
     /**
-     * 获取当前实例对象关联的泛型类型 T 的 Class 对象
+     * 获取当前类的泛型类型 T 的 Class 对象
+     * <p>
+     * 该方法使用反射机制从当前类(继承自 BaseMapperPlus 类)的泛型参数中获取第一个泛型类型 T 的 Class 对象
      *
-     * @return 返回当前实例对象关联的泛型类型 T 的 Class 对象
+     * @return 当前类的泛型类型 T 的 Class 对象
      */
     default Class<T> currentModelClass() {
-        return (Class<T>) GenericTypeUtils.resolveTypeArguments(this.getClass(), BaseMapperPlus.class)[0];
+        return (Class<T>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0);
     }
 
     /**
@@ -132,7 +135,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的单个VO对象
      */
     default V selectVoById(Serializable id) {
-        return this.selectVoById(id, this.currentVoClass());
+        return selectVoById(id, this.currentVoClass());
     }
 
     /**
@@ -158,7 +161,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的VO对象列表
      */
     default List<V> selectVoByIds(Collection<? extends Serializable> idList) {
-        return this.selectVoByIds(idList, this.currentVoClass());
+        return selectVoByIds(idList, this.currentVoClass());
     }
 
     /**
@@ -184,7 +187,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的VO对象列表
      */
     default List<V> selectVoByMap(Map<String, Object> map) {
-        return this.selectVoByMap(map, this.currentVoClass());
+        return selectVoByMap(map, this.currentVoClass());
     }
 
     /**
@@ -210,7 +213,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的单个VO对象
      */
     default V selectVoOne(Wrapper<T> wrapper) {
-        return this.selectVoOne(wrapper, this.currentVoClass());
+        return selectVoOne(wrapper, this.currentVoClass());
     }
 
     /**
@@ -221,12 +224,11 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的单个VO对象
      */
     default V selectVoOne(Wrapper<T> wrapper, boolean throwEx) {
-        return this.selectVoOne(wrapper, this.currentVoClass(), throwEx);
+        return selectVoOne(wrapper, this.currentVoClass(), throwEx);
     }
 
     /**
-     * 根据条件查询单个VO对象,并指定返回的VO对象的类型(自动拼接 limit 1)
-     * 注意不要再自己添加 limit 1 做限制了
+     * 根据条件查询单个VO对象,并指定返回的VO对象的类型
      *
      * @param wrapper 查询条件Wrapper
      * @param voClass 返回的VO对象的Class对象
@@ -234,12 +236,15 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的单个VO对象,经过类型转换为指定的VO类后返回
      */
     default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass) {
-        return this.selectVoOne(wrapper, voClass, true);
+        T obj = this.selectOne(wrapper);
+        if (ObjectUtil.isNull(obj)) {
+            return null;
+        }
+        return MapstructUtils.convert(obj, voClass);
     }
 
     /**
-     * 根据条件查询单个实体对象,并将其转换为指定的VO对象(自动拼接 limit 1)
-     * 注意不要再自己添加 limit 1 做限制了
+     * 根据条件查询单个实体对象,并将其转换为指定的VO对象
      *
      * @param wrapper 查询条件Wrapper
      * @param voClass 要转换的VO类的Class对象
@@ -255,33 +260,13 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
         return MapstructUtils.convert(obj, voClass);
     }
 
-    /**
-     * 根据条件查询单条记录(自动拼接 limit 1 限制返回 1 条数据,不依赖 {@code throwEx} 参数)
-     * 注意不要再自己添加 limit 1 做限制了
-     * <p>
-     * <strong>注意:</strong>
-     * 1. 使用 {@code Page<>(1, 1)} 强制分页查询,确保 SQL 自动添加 {@code LIMIT 1},因此 {@code throwEx} 参数不再生效
-     * 2. 原方法的 {@code throwEx} 逻辑(多条数据抛异常)已被优化掉,因为分页查询不会返回多条记录
-     * </p>
-     *
-     * @param queryWrapper 查询条件(可为 null)
-     * @param throwEx      <del>是否抛出异常(已弃用,此参数不再生效)</del>
-     * @return 单条记录或无数据时返回 null
-     */
-    @Override
-    default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, boolean throwEx) {
-        // 强制分页查询(LIMIT 1),确保最多返回 1 条记录
-        List<T> list = this.selectList(new Page<>(1, 1), queryWrapper);
-        return CollUtil.isEmpty(list) ? null : list.get(0);
-    }
-
     /**
      * 查询所有VO对象列表
      *
      * @return 查询到的VO对象列表
      */
     default List<V> selectVoList() {
-        return this.selectVoList(new QueryWrapper<>(), this.currentVoClass());
+        return selectVoList(new QueryWrapper<>(), this.currentVoClass());
     }
 
     /**
@@ -318,7 +303,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的VO对象分页列表
      */
     default <P extends IPage<V>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper) {
-        return this.selectVoPage(page, wrapper, this.currentVoClass());
+        return selectVoPage(page, wrapper, this.currentVoClass());
     }
 
     /**
@@ -352,7 +337,7 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
      * @return 查询到的符合条件的对象列表,经过转换为指定类型的对象后返回
      */
     default <C> List<C> selectObjs(Wrapper<T> wrapper, Function<? super Object, C> mapper) {
-        return StreamUtils.toList(this.selectObjs(wrapper), mapper);
+        return this.selectObjs(wrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
     }
 
 }