Mybatis枚举映射异常

异常描述

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'xxx' from result set. Cause: java.lang.IllegalArgumentException: No enum constant com.xxx.xxx.enums.XxxEnum.Xxx

原因:没有配置枚举的扫描包 type-enums-package

解决:在配置文件中指定枚举的扫描包

application.yaml:

mybatis-plus:
  type-enums-package: xxx.xxx.xxx.enums

application.properties:

mybatis-plus.type-enums-package=com.cyan.test.demo.enums

完整使用Mybatis映射枚举

1)在配置文件中加入 type-enums-package 指定枚举的扫描包

MyBatis-Plus将为包内(包含子包)所有枚举进行适配,可以使用逗号或分号分隔多个包名(支持统配符 *)

application.yaml:

mybatis-plus:
  type-enums-package: 枚举包

application.properties:

mybatis-plus.type-enums-package=枚举包

2)在枚举类中指定数据库值所对应的属性。有两种方式

① 实现官方提供的 IEnum 接口,接口中的 getValue 方法与数据库值对应的属性。

@Getter
@AllArgsConstructor
@ToString
public enum SexEnum implements IEnum<Integer> {

    WOMAN(0, "女"),

    MAN(1, "男");

    // 标记数据库存的值是value
    private final Integer value;

    private final String desc;

}

② 将属性使用 EnumValue 注解标记数据库值对应的属性。

@Getter
@AllArgsConstructor
@ToString
public enum SexEnum {

    WOMAN(0, "女"),

    MAN(1, "男");

    // 标记数据库存的值是value
    @EnumValue
    private final Integer value;

    private final String desc;

}

3)在类的属性声明上直接将字段类型写为枚举类型,读取时将自动转换数据库值为枚举对象。

@Data
@TableName(value = "personal")
public class Personal  {

    private Integer id;

    private String name;

    private SexEnum sex;

    private Integer age;

}

读取数据库中的两条数据进行测试,可以看到值被成功转换为了枚举。

image

image

原文地址:https://www.cnblogs.com/Dm920/p/15787462.html