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

相关推荐
伯明翰java5 分钟前
Java数据类型与变量
java·开发语言
6极地诈唬14 分钟前
【PG漫步】DELETE不会改变本地文件的大小,VACUUM也不会
linux·服务器·数据库
想用offer打牌17 分钟前
如何开启第一次开源贡献之路?
java·后端·面试·开源·github
小许学java1 小时前
Spring原理
java·spring·生命周期·作用域·原理
教练、我想打篮球1 小时前
122 Hession,FastJson,ObjectInputStream的序列化反序列化相同引用的处理
java·config·utils
MZWeiei1 小时前
Redis持久化机制中的 AOF机制简单介绍
数据库·redis
Elastic 中国社区官方博客1 小时前
Elasticsearch:在 X-mas 吃一些更健康的东西
android·大数据·数据库·人工智能·elasticsearch·搜索引擎·全文检索
酷柚易汛1 小时前
酷柚易汛ERP 2025-12-26系统升级日志
java·前端·数据库·php
侠客行03172 小时前
Mybatis入门到精通 一
java·mybatis·源码阅读
消失的旧时光-19432 小时前
微服务的本质,其实是操作系统设计思想
java·大数据·微服务