将枚举转换为字符
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
这里会给你一个数字 0
,1
或 2
给出值在枚举中定义的顺序。
所以当你定义:
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 了解更多详情。
我正在做一个 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
这里会给你一个数字 0
,1
或 2
给出值在枚举中定义的顺序。
所以当你定义:
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 了解更多详情。