首页 > 解决方案 > Spring JpaRepository ENUM 不匹配

问题描述

我的枚举类如下:

public enum Sex {

    MALE('M'), FEMALE('F'), UNKNOWN('U');

    char name;

    Sex(char name) {
        this.name = name;
    }

    public char getName() {
        return name;
    }
}

我的属性的 H2 数据库架构如下:

sex CHAR(1),

我的模型类是:

@Column
@NotNull
@Enumerated(EnumType.STRING)
private Sex sex;

当我尝试通过以下方式填充我的模型时,JpaRepository出现异常: java.lang.IllegalArgumentException: No enum constant com.awesome.enumeration.Sex.M

是什么阻止我将我的数据库映射到枚举?

标签: javaspringenumsspring-data-jpah2

解决方案


您可以为您的 enum 编写一个自定义转换器:

@Converter
public class SexConverter implements AttributeConverter<Sex, Character> {


    @Override
    public Character convertToDatabaseColumn(Sex sex) {
        return sex.getName();
    }

    @Override
    public Sex convertToEntityAttribute(Character dbData) {
        return Sex.getByName(dbData);
    }
}

然后在您的实体中:

@Entity
public class TestEntity {

    @Column
    @NotNull
    @Convert(converter = SexConverter.class)
    private Sex sex;
}

我还在您的枚举上创建了辅助静态方法,以通过字符名称获取枚举:

public enum Sex {

    MALE('M'), FEMALE('F'), UNKNOWN('U');

    char name;

    Sex(char name) {
        this.name = name;
    }

    public char getName() {
        return name;
    }

    public static Sex getByName(char name) {
        return Arrays.stream(Sex.values())
                .filter(sex -> sex.getName() == name)
                .findFirst()
                .orElse(UNKNOWN);
    }
}

推荐阅读