From 8f1d2b214f5e27b9da05698ecdd96825e5bd1144 Mon Sep 17 00:00:00 2001 From: "robor.luo" Date: Mon, 25 Mar 2024 21:34:57 +0800 Subject: [PATCH] fix: issues #302, enum question --- .../core/mybatis/SqlArgsParameterHandler.java | 8 +++++++- .../com/mybatisflex/core/query/WrapperUtil.java | 13 ++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java index cce9f412..6fe0487c 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/mybatis/SqlArgsParameterHandler.java @@ -17,6 +17,7 @@ package com.mybatisflex.core.mybatis; import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.exception.FlexExceptions; +import com.mybatisflex.core.util.EnumWrapper; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.scripting.defaults.DefaultParameterHandler; @@ -25,7 +26,6 @@ import org.apache.ibatis.type.TypeHandlerRegistry; import java.sql.PreparedStatement; import java.sql.SQLException; -import java.sql.Types; import java.util.Map; /** @@ -80,6 +80,12 @@ public class SqlArgsParameterHandler extends DefaultParameterHandler { TypeHandler typeHandler = typeHandlerRegistry.getTypeHandler(value.getClass()); if (typeHandler == null) { typeHandler = typeHandlerRegistry.getUnknownTypeHandler(); + + // 枚举值特殊处理:若未注册枚举TypeHandler,则判断@EnumValue,若没有@EnumValue注解,则获取枚举的name + if(value instanceof Enum){ + EnumWrapper enumWrapper = EnumWrapper.of(value.getClass()); + value = enumWrapper.getEnumValue((Enum) value); + } } // 此处的 jdbcType 可以为 null 的,原因是 value 不为 null, diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java index 2da9b47f..16cfa1c0 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/WrapperUtil.java @@ -106,7 +106,7 @@ class WrapperUtil { addParam(params, value); getValues(condition.next, params); } - + @SuppressWarnings("all") private static void addParam(List paras, Object value) { if (value == null) { paras.add(null); @@ -117,13 +117,12 @@ class WrapperUtil { } else if (value instanceof QueryWrapper) { Object[] valueArray = ((QueryWrapper) value).getAllValueArray(); paras.addAll(Arrays.asList(valueArray)); - } else if (value.getClass().isEnum()) { + } else if (value instanceof Enum) { + // 枚举类型,处理枚举实际值 EnumWrapper enumWrapper = EnumWrapper.of(value.getClass()); - if (enumWrapper.hasEnumValueAnnotation()) { - paras.add(enumWrapper.getEnumValue((Enum) value)); - } else { - paras.add(((Enum) value).name()); - } + // 如果是使用注解标识枚举实际值,则直接获取实际值,但如果是依靠全局枚举TypeHandler处理,则此处只能先存入枚举实例,在SQL执行时才能处理实际值 + value = enumWrapper.hasEnumValueAnnotation() ? enumWrapper.getEnumValue((Enum) value) : value; + paras.add(value); } else { paras.add(value); }