Java JPA使用空格检索枚举
我有一个spring引导应用程序,并且定义了一些POJO类来指定数据模型。在表中,我想存储枚举列,但我有一个枚举数据类型,并且一些枚举包含空格Java JPA使用空格检索枚举,java,jpa,enums,Java,Jpa,Enums,我有一个spring引导应用程序,并且定义了一些POJO类来指定数据模型。在表中,我想存储枚举列,但我有一个枚举数据类型,并且一些枚举包含空格 enum DataEnum { Workload("Workload"), ReleaseContent("Release content"), "VerificationProc"("Verification proc") private String name = ""; DataEnum (final String
enum DataEnum {
Workload("Workload"),
ReleaseContent("Release content"),
"VerificationProc"("Verification proc")
private String name = "";
DataEnum (final String name) {
this.name = name;
}
public String getName() {
return name;
}
public DataEnum fromString(String value) {
return DataEnum.valueOf(value);
}
@Override
public String toString() {
return name;
}
}
我有一个POJO实体类,如下所示:
@Entity
@IdClass(FieldId.class)
public class Field {
@Id
private String id;
@Id
@Enumerated(EnumType.STRING)
private DataEnum sheet;
...
}
当我尝试从数据库检索数据时,我得到:
java.lang.IllegalArgumentException:未知名称值[Release]
枚举类[data.util.DataEnum]的内容]
JPA无法将您的字符串映射到枚举,因为它找不到任何具有该名称的枚举 在内部,@Enumerated使用方法
Enum.valueOf
将DB字符串转换为Enum常量。DB字符串必须与枚举常量标识符完全相同
也就是说,如果要存储DataEnum.ReleaseContent
,则必须将其存储为ReleaseContent
而不是ReleaseContent
在您的情况下,如果要存储与枚举标识符不同的值,可以声明自定义转换器:
@Converter
public class DataEnumConverter implements AttributeConverter<DataEnum, String> {
@Override
public String convertToDatabaseColumn(DataEnum enum) {
// Convert your enum to DB value
}
@Override
public DataEnum convertToEntityAttribute(String dbValue) {
// Convert String to your enum
}
}
JPA无法将您的字符串映射到枚举,因为它找不到任何具有该名称的枚举 在内部,@Enumerated使用方法
Enum.valueOf
将DB字符串转换为Enum常量。DB字符串必须与枚举常量标识符完全相同
也就是说,如果要存储DataEnum.ReleaseContent
,则必须将其存储为ReleaseContent
而不是ReleaseContent
在您的情况下,如果要存储与枚举标识符不同的值,可以声明自定义转换器:
@Converter
public class DataEnumConverter implements AttributeConverter<DataEnum, String> {
@Override
public String convertToDatabaseColumn(DataEnum enum) {
// Convert your enum to DB value
}
@Override
public DataEnum convertToEntityAttribute(String dbValue) {
// Convert String to your enum
}
}
什么是“包含空间的枚举”。Show code因此,您试图通过名称值而不是枚举的字符串值(即ReleaseContent)获取枚举?不要使用toString()来显示名称。制作一个getName()方法或其他东西。@VeselinDavidov为什么?
java.lang.Enum
的Javadoc声明“当存在更“程序员友好”的字符串形式时,枚举类型应覆盖此方法。”。您不能依赖枚举上的toString()
来返回常量名称-为此,还有最后一个方法enum.name()
Hmm它可以是调用getName()而不是name()的ORM吗?什么是“枚举包含空间”。Show code因此,您试图通过名称值而不是枚举的字符串值(即ReleaseContent)获取枚举?不要使用toString()来显示名称。制作一个getName()方法或其他东西。@VeselinDavidov为什么?java.lang.Enum
的Javadoc声明“当存在更“程序员友好”的字符串形式时,枚举类型应覆盖此方法。”。您不能依赖枚举上的toString()
来返回常量名称-为此,还有最后一个方法enum.name()
Hmm它是调用getName()而不是name()的ORM吗?还是只在数据库中存储枚举常量而不是它们的名称;)您甚至不确定名称是否唯一,常量是否唯一。您是否看到OP:ReleaseContent(“ReleaseContent”),
的当前数据结构?友好名称与枚举标识符不匹配。很多时候,您希望保存一个与枚举标识符不同的名称。程序员的工作就是为enum提供这样一个唯一的名称。我看到了数据结构,但如果他使用@Enumerated(EnumType.STRING),进入数据库的值将是ReleaseContent->enum常量。问题的出现是因为在数据库中,他有另一个值“Release Content”,我尝试了converter方法,但得到的结果是:无法写入JSON文档:无法从ResultSet读取实体状态:。。嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法从结果中读取实体状态为什么它与JSON相关?你在做什么?是否尝试将实体返回到浏览器?给我完整的stacktrace文件,或者只在数据库中存储枚举常量,而不是它们的名称;)您甚至不确定名称是否唯一,常量是否唯一。您是否看到OP:ReleaseContent(“ReleaseContent”),
的当前数据结构?友好名称与枚举标识符不匹配。很多时候,您希望保存一个与枚举标识符不同的名称。程序员的工作就是为enum提供这样一个唯一的名称。我看到了数据结构,但如果他使用@Enumerated(EnumType.STRING),进入数据库的值将是ReleaseContent->enum常量。问题的出现是因为在数据库中,他有另一个值“Release Content”,我尝试了converter方法,但得到的结果是:无法写入JSON文档:无法从ResultSet读取实体状态:。。嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法从结果中读取实体状态为什么它与JSON相关?你在做什么?是否尝试将实体返回到浏览器?给我发完整的stacktrace,伙计