我的域类有映射到枚举的属性。奇怪的是,MyBatis 3.4.x ( 3.4.0和3.4.4 )。这适用于3.3.x)和Spring MyBatis 1.3.1,尝试用一个不相关的枚举映射它,并给出错误。
org.apache.ibatis.executor.result.ResultMapException: org.mybatis.spring.MyBatisSystemException:嵌套异常是试图从结果集获取列“order_line_programmed”的org.mybatis.spring.MyBatisSystemException错误。原因: java.lang.IllegalArgumentException:无枚举常量foo.UnrelatedEnum.yes
我的域类如下所示:
public class OrderLine {
private Long id;
private Product product;
private ProgrammedStatus programmedStatus;
private String programmedFeedback;
private boolean completed = false;
}ProgrammedStatus是一个简单的枚举
public enum ProgrammedStatus {
yes, no, error;
}这个programmedStatus被映射到程序列,如下所示,
<resultMap id="orderLineResult" type="foo.OrderLine">
<id property="id" column="technical_order_line_id" />
<result property="programmedStatus" column="order_line_programmed" typeHandler="org.apache.ibatis.type.EnumTypeHandler" />
<result property="programmedFeedback" column="order_line_programmed_feedback" />
<result property="completed" column="order_line_completed"
javaType="java.lang.Boolean" typeHandler="org.apache.ibatis.type.BooleanTypeHandler" />
<association property="product"
notNullColumn="order_line_product_id"
resultMap="foo.repository.mapper.ProductMapper.productResult" />
</resultMap>我甚至尝试将javaType映射到typeHandler,但是MyBatis似乎忽略了它。
很少有有用的信息,
我在代码的其他地方也发现了这个问题。我可以在这里拥有自己的特定typeHandler,而不是EnumTypeHandler。问题是,这种枚举匹配在我的程序中的许多地方使用,迁移wit 3.4会使我的程序不稳定。
发布于 2018-01-09 14:13:27
删除显式提到的enum typeHandler为我工作。
删除: typeHandler="org.apache.ibatis.type.EnumTypeHandler“
<resultMap id="orderLineResult" type="foo.OrderLine">
<id property="id" column="technical_order_line_id" />
<result property="programmedStatus" column="order_line_programmed" />
<result property="programmedFeedback" column="order_line_programmed_feedback" />
<result property="completed" column="order_line_completed"
javaType="java.lang.Boolean" typeHandler="org.apache.ibatis.type.BooleanTypeHandler" />
<association property="product"
notNullColumn="order_line_product_id"
resultMap="foo.repository.mapper.ProductMapper.productResult" />
</resultMap>发布于 2022-10-28 14:44:45
正如这里所解释的,不应该将https://github.com/mybatis/mybatis-3/issues/995 - EnumTypeHandler显式指定为枚举属性的类型处理程序,因为(作为类型处理程序)它将在所有其他显式指定的映射中被缓存和重新使用(这将导致原始问题)。为了避免这种情况,让MyBatis找出枚举属性的类型处理程序。如果您的枚举是“特殊的”,您可以子类EnumTypeHandler并在需要的地方显式引用它,但是缓存是可以的,因为每次它都处理完全相同的枚举类型。
https://stackoverflow.com/questions/44450930
复制相似问题