我想在数据库表中存储和检索特殊字符(/
、*
等)。这是我的尝试:
public enum SpecialCharacters {
Hack("H/K"), Gk("G*M");
private String value;
private SpecialCharacters(String value) {
this.value = value;
}
public String toString() {
return this.value; // This will return , # or +
}
}
@Column(name = "Special_Char")
@Enumerated(EnumType.STRING)
private SpecialCharacters specialCharacters;
...
但在 DB 表中它只存储枚举字段名称,如 Hack 和 Gk,而不是 H/K 和 G*M
最佳答案
使用@Enumerated
注解,您只能存储枚举的名称或序号。在 JPA 2.1 中,您可以使用 @Converter
注释。
参见 specification 的第 11.1.10 章.
例子:
枚举:
public enum SpecialCharacter {
Hack("H/K"),
Gk("G*M");
private String value;
private SpecialCharacter(String value) {
this.value = value;
}
public String toString() {
return this.value; // This will return , # or +
}
public static SpecialCharacter valueOfKey(String key) {
for (SpecialCharacter specialCharacter : values()) {
if (specialCharacter.toString().equals(key)) {
return specialCharacter;
}
}
throw new IllegalArgumentException("Illegal key");
}
}
转换器类:
@Converter(autoApply = true)
public class SpecialCharacterConverter implements AttributeConverter<SpecialCharacter, String> {
/**
* Converts a {@link SpecialCharacter} to the correspondig String that is used in the database
*/
@Override
public String convertToDatabaseColumn(SpecialCharacter specialCharacter) {
return specialCharacter.toString();
}
/**
* Converts a String from the database to the corresponding {@link SpecialCharacter}.
*/
@Override
public SpecialCharacter convertToEntityAttribute(String dbValue) {
return SpecialCharacter.valueOfKey(dbValue);
}
}
实体对象:
@Entity
public class SomeEntity {
@Column(name = "Special_Char")
private SpecialCharacter specialCharacter;
public SpecialCharacter getSpecialCharacter() {
return this.specialCharacter;
}
public void setSpecialCharacter(SpecialCharacter specialCharacter) {
this.specialCharacter = specialCharacter;
}
}
关于java - 在 Enum 数据类型中保存特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629265/