将枚举转换为字符

Convert enum to char

我正在做一个 Hibernate 项目,这里是我的 class:

的摘录
@Entity
@Table(name = "T_JOB")
@SequenceGenerator(name = "seqJob", sequenceName = "SEQ_JOB", allocationSize = 1)
@Getter
@Setter
public class Job {

    @Convert(converter = HibernateBooleenVersCaractere.class)
    @Column(name = "STATUT_EXTRACTION")
    private boolean statutExtraction;
}

在我的数据库中,STATUT_EXTRACTION 是一个 CHAR 类型,这就是我使用转换器(HibernateBooleenVersCaractere 实现 AttributeConverter)的原因,它工作得很好。 布尔值 statutExtraction 直到现在都很有用,因为我只有两个状态(数据库中的 OK = true = 1,数据库中的 Error = false = 0)。但是现在我想添加一个状态。为此,我创建了一个枚举状态并使用了枚举类型:

@Entity
@Table(name = "T_JOB")
@SequenceGenerator(name = "seqJob", sequenceName = "SEQ_JOB", allocationSize = 1)
@Getter
@Setter
public class Job {
    public enum Statut {
        ERROR, OK, LOAD
    }

    @Column(name = "STATUT_EXTRACTION")
    @Enumerated(EnumType.STRING)
    private Statut statutExtraction;
}

这里我得到一个错误,这是由于 EnumType 与数据库中的 STATUT_EXTRACTION 类型不同,我猜。

我有第二个想法:像我一样使用转换器将 boolean 转换为 char:

public class HibernateEnumVersChar
        implements
        AttributeConverter<Statut, Character> {

    @Override
    public Character convertToDatabaseColumn(final Statut statut) {
        if (statut == Statut.OK) {
            return '1';
        } else if (statut == Statut.LOAD) {
            return '2';
        } else if (statut == Statut.ERROR) {
            return '0';
        } else {
            return null;
        }

    }

    @Override
    public Statut convertToEntityAttribute(final Character dbData) {
        if (dbData == '1') {
            return Statut.OK;
        } else if (dbData == '2') {
            return Statut.LOAD;
        } else if (dbData == '0') {
            return Statut.ERROR;
        } else {
            return null;
        }
    }

}

并将我的工作 class 更改为:

@Entity
@Table(name = "T_JOB")
@SequenceGenerator(name = "seqJob", sequenceName = "SEQ_JOB", allocationSize = 1)
@Getter
@Setter
public class Job {
    public enum Statut {
        ERROR, OK, LOAD
    }

    @Convert(converter = HibernateEnumVersChar.class)
    @Column(name = "STATUT_EXTRACTION")
    private Statut statutExtraction;
}

这里我有这个错误:

Error attempting to apply AttributeConverter

遗憾的是我无法更改数据库类型 (char),因为我有很多数据。

有没有人知道我的错误在哪里(或者为什么不用不同的方法来做我需要做的事情!)?

我在这里建议的是使用带有属性 EnumType.ORDINAL@Enumerated 注释,ORDINAL 这里会给你一个数字 012 给出值在枚举中定义的顺序。

所以当你定义:

public enum Statut {
    ERROR, OK, LOAD
}

所以这里我们将有:

Statut.ERROR.ordinal()  ---> gives 0
Statut.OK.ordinal()  ---> gives 1
Statut.LOAD.ordinal()  ---> gives 2

结论:

像这样更改您的列定义:

@Enumerated(EnumType.ORDINAL)
@Column(name = "STATUT_EXTRACTION")
private Statut statutExtraction;

注:

数据库列应更改为 NUMBER(1,0),或者您可以将其转换为枚举定义中的 Char,请阅读 Hibernate & Enum handling article 了解更多详情。