fix: issues #302, enum question

This commit is contained in:
robor.luo 2024-03-25 21:34:57 +08:00
parent 8eb8807ac8
commit 8f1d2b214f
2 changed files with 13 additions and 8 deletions

View File

@ -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

View File

@ -106,7 +106,7 @@ class WrapperUtil {
addParam(params, value);
getValues(condition.next, params);
}
@SuppressWarnings("all")
private static void addParam(List<Object> 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);
}