Spring JpaRepository ENUM不匹配

时间:2019-05-15 14:28:44

标签: java spring enums spring-data-jpa h2

我的枚举类如下:

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

是什么使我无法将数据库映射到枚举?

2 个答案:

答案 0 :(得分:3)

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

@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);
    }
}

答案 1 :(得分:-1)

它将尝试查找名称为M的枚举。您的枚举是MALE,FEMAL和UNKNOWN。您可以将枚举更改为UILabel