gpt4 book ai didi

java - 将枚举转换为字符

转载 作者:行者123 更新时间:2023-11-30 06:26:13 24 4
gpt4 key购买 nike

我正在开发一个 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)的原因,并且它工作得很好。 boolean statutExtraction 到目前为止很有用,因为我只有两个状态(DB 中 OK = true = 1,DB 中 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 值转换为字符一样:

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

}

并将我的工作类别更改为:

@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 给出在 Enum 中定义值的顺序。

所以当你定义时:

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),或者您可以将其转换为 Enum 定义中的 Char,请阅读 Hibernate & Enum handling article了解更多详情。

关于java - 将枚举转换为字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47155541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com