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

相关推荐
绝顶少年13 分钟前
Spring 框架中 RestTemplate 的使用方法
java·后端·spring
小趴菜822715 分钟前
安卓人机验证View
android·java·前端
阿巴~阿巴~18 分钟前
MySQL复合查询(重点)
服务器·数据库·sql·mysql·ubuntu
观望过往35 分钟前
【Java SE 运算符】全面解析与实践指南
java
没有bug.的程序员37 分钟前
分布式架构初识:为什么需要分布式
java·分布式·架构·php
帧栈1 小时前
开发避坑指南(61):Redis持久化失败:RDB快照因磁盘问题无法保存解决方案
数据库·redis·缓存
郑州光合科技余经理1 小时前
微服务架构:基于Spring Cloud ,构建同城生活服务平台
java·spring cloud·微服务·小程序·架构·uni-app
ajassi20001 小时前
开源 java android app 开发(十七)封库--混淆源码
android·java·开源
海梨花1 小时前
关于Java的几个小问题
java·面试
thginWalker1 小时前
深入剖析 MyBatis 核心原理-模块三:核心处理层(下)
mybatis