在使用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_data
的type
列存储的值与枚举的code
字段一一对应:
数据库值 | 枚举项 |
---|---|
1 | Target_LandPlat |
2 | Target_AirPlat |
3 | Target_SeaPlat |
4 | Target_SpacePlat |
5 | Target_Missile |
4. 验证修复
-
测试查询 :运行代码,确保数据库中的
type
值能正确映射到枚举。 -
检查拼写 :确认枚举名称无拼写错误(如
Target_SpacePlat
和Target_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
错误,实现数据库数字到枚举的自动映射。