解决MyBatis-Plus枚举映射错误:No enum constant问题

在使用MyBatis-Plus进行数据库操作时,如果数据库字段存储的是数字,而代码中定义的枚举未正确映射这些数字,可能会导致以下错误:

Error querying database. Cause: java.lang.IllegalArgumentException: No enum constant com.example.YourEnum.1

本文将详细分析该问题的原因,并提供完整的解决方案。


1. 问题背景

假设存在以下实体类,其中type字段对应数据库中的一个整数类型字段:

java 复制代码
@TableName("pd_device_data")
public class PDDeviceDataTable {
    public enum TargetTypes {
        Target_LandPlat,
        Target_AirPlat,
        Target_SeaPlat,
        Target_SpacePlat,
        Target_Missile
    }

    @TableField("type")
    private TargetTypes type;  // 数据库存储的是整数(如1, 2, 3...)
}
复制代码
当从数据库查询数据时,若type字段的值为1,而枚举未定义数字映射,MyBatis-Plus会尝试通过枚举名称匹配,导致以下错误:

No enum constant com.example.TargetTypes.1


原因分析

  • 数据库存储的是数字 :例如,type字段存储的是1,而非枚举名称Target_LandPlat

  • 枚举未定义数值映射 :代码中的枚举未通过@EnumValue指定与数据库数字对应的字段。

  • MyBatis-Plus默认行为:默认情况下,MyBatis-Plus会尝试通过枚举名称(或顺序位置)匹配数据库值,而非自定义数值。


解决方案

1. 修改枚举定义,添加数值映射

为每个枚举项绑定一个整数,并使用@EnumValue标记该字段:

java 复制代码
public enum TargetTypes {
    Target_LandPlat(1),
    Target_AirPlat(2),
    Target_SeaPlat(3),
    Target_SpacePlat(4),
    Target_Missile(5);

    @EnumValue  // 标记此字段与数据库值对应
    private final int code;

    TargetTypes(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}
复制代码
2. 验证字段值

确保数据库表pd_device_datatype列存储的值与枚举的code字段一一对应:

数据库值 枚举项
1 Target_LandPlat
2 Target_AirPlat
3 Target_SeaPlat
4 Target_SpacePlat
5 Target_Missile

4. 验证修复

  • 测试查询 :运行代码,确保数据库中的type值能正确映射到枚举。

  • 检查拼写 :确认枚举名称无拼写错误(如Target_SpacePlatTarget_Missile)。


完整代码示例

java 复制代码
@Data
@TableName("pd_device_data")
public class PDDeviceDataTable {
    public enum TargetTypes {
        Target_LandPlat(1),
        Target_AirPlat(2),
        Target_SeaPlat(3),
        Target_SpacePlat(4),
        Target_Missile(5);

        @EnumValue
        private final int code;

        TargetTypes(int code) {
            this.code = code;
        }
    }

    @TableId(type = IdType.AUTO)
    private Integer id;

    @TableField("type")
    private TargetTypes type;
}

总结

  • 核心问题:数据库存储的是数字,而枚举未定义数值映射。

  • 解决关键 :使用@EnumValue绑定枚举值与数据库字段,并配置MyBatis-Plus的枚举处理器。

  • 验证要点 :确保数据库值与枚举code字段一一对应,避免拼写错误。

通过以上步骤,即可解决No enum constant错误,实现数据库数字到枚举的自动映射。

相关推荐
wellc18 小时前
SpringBoot集成Flowable
java·spring boot·后端
gmaajt18 小时前
mysql如何检查数据库表是否存在损坏_使用CHECK TABLE命令修复
jvm·数据库·python
heRs BART19 小时前
【Flask】四、flask连接并操作数据库
数据库·python·flask
Lucifer三思而后行19 小时前
一次 Oracle RAC 归档告警排查
数据库·oracle
zhuiyisuifeng19 小时前
PostgreSQL常用时间函数与时间计算提取示例说明
数据库·postgresql
wellc19 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
Irissgwe19 小时前
redis之常见数据类型
数据库·redis·缓存
2301_7735536219 小时前
CSS如何对用户访问过的链接进行降级颜色处理_使用-visited伪类改变颜色
jvm·数据库·python
Hui Baby19 小时前
springAi+MCP三种
java
hsjcjh19 小时前
【MySQL】C# 连接MySQL
java