解决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错误,实现数据库数字到枚举的自动映射。

相关推荐
在肯德基吃麻辣烫几秒前
《Redis》持久化
数据库·redis·缓存
xiaolyuh12319 分钟前
基于binlog恢复误删除MySQL数据
数据库·mysql
Tirson Yang19 分钟前
西安java面试总结1
java·面试
小猫咪怎么会有坏心思呢20 分钟前
华为OD机试-猴子爬山-dp(JAVA 2025A卷)
java·算法·华为od
保持学习ing24 分钟前
SpringBoot 前后台交互 -- CRUD
java·spring boot·后端·ssm·项目实战·页面放行
Gauss松鼠会30 分钟前
GaussDB分布式数据库调优方法总结:从架构到实践的全链路优化指南
数据库·分布式·sql·database·gaussdb
码海漫游者833 分钟前
让Python成为你的网站引擎:Django全栈开发初体验!!!
数据库·python·其他·django
Databend37 分钟前
玩转 Databend UDF
数据库
曼汐 .1 小时前
数据库管理与高可用-PostgreSQL日常维护
数据库
小陈又菜1 小时前
SQL ConcurrencyControl(并发控制)
数据库·sql··并发控制