实体用枚举接收数据库列,却报 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里显示成什么,不能证明数据库映射已经正确。