实体用枚举接收数据库列,却报 No enum constant,先确认数据库存的是枚举常量名,还是独立业务编码。框架按名称查找 ACTIVE,与按编码查找 1,不是同一种映射。
这次旧项目使用3.4.0
2023年的记录明确写了MyBatis-Plus 3.4.0,查询时出现:
Error attempting to get column 'xxx' from result set.
Cause: java.lang.IllegalArgumentException: No enum constant xxx
当时检查了两个位置:用于持久化的枚举字段是否标 @EnumValue,以及该版本的枚举包扫描配置。原记录没有完整枚举与数据库样本,下面用独立示例说明两处怎样配合,不冒充原项目模型。
先让枚举表达真正的数据库值
假设数据库status列存整数0或1,Java定义为:
package example.domain.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
public enum Status {
DISABLED(0),
ACTIVE(1);
@EnumValue
private final int code;
Status(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
实体中的字段为 private Status status;,并有相应访问方法及常规字段映射。这里要持久化的是code,不是 ACTIVE 字符串,也不是ordinal。官方说明区分按常量名、序号和声明属性的处理方式;JSON返回格式则是另一层契约。MyBatis-Plus枚举映射
旧版本还要核对扫描与实际处理器
在这份3.4.0记录里,配置的形状是:
mybatis-plus:
type-enums-package: example.domain.enums
包名替换为枚举实际所在位置。v3.4.0配置源码确有 typeEnumsPackage;还须确认项目用的是对应MyBatis-Plus自动配置和SqlSessionFactory,未被自定义配置绕开。v3.4.0配置源码
不把“加扫描路径”推广为所有版本的必需步骤。官方3.5.2更新记录说明优化枚举处理后不再需要typeEnumsPackage配置;这是配置机制的版本变化,不是所有No enum constant都能靠升级解决。升级时仍要查对应版本说明及实际依赖树,不只复制旧配置。MyBatis-Plus更新记录
配置正确之后,还要查值本身
按顺序核对数据库原始值、列类型、枚举属性类型和最终选中的TypeHandler。特别检查 "1" 与整数1、空格、大小写、null以及已经删除的历史编码。
未知编码如何处理,应由业务明确决定:拒绝、迁移旧数据或设计未知状态,不能静默映射成一个看似合法的默认值。验证至少包含已知值读写、null、未知值及一次完整映射往返;接口JSON里显示成什么,不能证明数据库映射已经正确。