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

相关推荐
Hello World......1 小时前
互联网大厂Java面试:从Spring到微服务的全面探讨
java·spring boot·spring cloud·微服务·面试·技术栈·互联网大厂
伤不起bb2 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
拾贰_C2 小时前
【SpringBoot】MyBatisPlus(MP | 分页查询操作
java·spring boot·后端·spring·maven·apache·intellij-idea
猛踹瘸子那条好腿の2 小时前
Spring-boot初次使用
java·springboot
我不是程序猿儿4 小时前
【C#】 lock 关键字
java·开发语言·c#
tmacfrank5 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
weixin_472339466 小时前
Maven 下载安装与配置教程
java·maven
Magnum Lehar7 小时前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
Yushan Bai7 小时前
ORACLE RAC环境REDO日志量突然增加的分析
数据库·oracle
躺着听Jay7 小时前
Oracle-相关笔记
数据库·笔记·oracle