【发布时间】:2017-08-20 11:13:43
【问题描述】:
我的 MyBatis 代码没有加载枚举类型(版本:3.4.4)。
在 MySQL 数据库中,我有一个带有“cartype”字段的表,它是一个 INT(11) 类型。 在 Java 中,我创建了一个用于处理汽车类型的 ENUM:
public enum CarType {
SEDAN(1), LIMUSIN(2), WAGON(3);
private int id;
CarType(int id) {
this.id = id;
}
public int getId() {
return this.id;
}
}
汽车映射器 xml 看起来像这样(不包含所有数据):
<select id="selectCar" parameterType="Car" resultMap="carResultMap">
SELECT * FROM Cars WHERE car_name="#{carName}";
</select>
<resultMap id="carResultMap" type="Car">
<id property="id" column="car_name"/>
<result property="carType" column="cartype"/>
</resultMap>
最后我的 bean 如下所示:
public class Car {
private Integer id;
private CarType carType;
}
bean 也包含 getter 和 setter。
当我尝试在 java 中获取 Car 时,它会抛出以下异常:
Caused by: java.lang.IllegalArgumentException: No enum constant org.data.bean.CarType.1
at java.lang.Enum.valueOf(Enum.java:238)
at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:49)
at org.apache.ibatis.type.EnumTypeHandler.getNullableResult(EnumTypeHandler.java:26)
at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:66)
【问题讨论】:
-
您可以尝试在这里构建和链接一个最小的、完整的示例,其中包含 -for example- h2 数据库(在内存中)和 maven,以便它可以轻松运行。我也认为这是枚举的名称(例如,需要存储在数据库中的“SEDAN”,而不是 id)
-
感谢它使用枚举名称而不是 id。在 select 语句中应该使用 UPPER() 方法作为名称,这对于解决方案来说有点加分。