Java hibernate可以用空格映射枚举类型吗?
通过hibernate映射遗留数据库,我想使用EnumTypes将包含带空格的字符串常量的某些列映射到某个Enum类 映射:Java hibernate可以用空格映射枚举类型吗?,java,hibernate,jpa,Java,Hibernate,Jpa,通过hibernate映射遗留数据库,我想使用EnumTypes将包含带空格的字符串常量的某些列映射到某个Enum类 映射: @Entity @Table(name = "OPERATOR") public class Operator { @Id @Column(name = "ID") private Long id; ... @Enumerated(EnumType.STRING) @Column(name = "STATUS")
@Entity
@Table(name = "OPERATOR")
public class Operator {
@Id
@Column(name = "ID")
private Long id;
...
@Enumerated(EnumType.STRING)
@Column(name = "STATUS")
private Status status;
...
}
public enum Status {
OPERATOR_CREATED("Operator created"),
ACTIVE("Active"),
END_DATED("End dated");
private String name;
Status(String status) {
name = status;
}
}
正如您所看到的,我们不能将数据库值直接作为枚举名使用,因为其中有空格
我想知道是否可以为此使用枚举?查看(在“灵活解决方案”下)中描述的
GenericEnumUserType
修改状态
,如下所示:
public enum Status
{
OPERATOR_CREATED("Operator created"),
ACTIVE("Active"),
END_DATED("End dated");
private String name;
Status(String status)
{
name = status;
}
public String toString()
{
return name;
}
public Status fromString( String value )
{
if ( "Operator created".equals( value )
{
return OPERATOR_CREATED;
}
//etc
}
}
现在在实体上使用@Type
注释
@Entity
@Table(name = "OPERATOR")
public class Operator {
@Id
@Column(name = "ID")
private Long id;
...
@Column(name = "STATUS", columnDefinition = "VARCHAR(31)", nullable = false )
@Type( type = "my.package.GenericEnumUserType",
parameters = {
@Parameter( name = "enumClass", value = "my.package.Status" ),
@Parameter( name = "identifierMethod", value = "toString" ),
@Parameter( name = "valueOfMethod", value = "fromString" ) } )
private Status status;
...
}
我遇到了同样的情况,尝试使用
replace
函数,如下所示:
@ColumnTransformer(read = "replace(status::varchar, ' ', '')", write = "replace(?, 'End', 'End ')::status")
你有下划线,所以需要修改一下
regexp\u replace
如果有多个带有空格的枚举值,也很方便
注意,我使用的是postgresql 9.6,您还可以考虑使用ReversibleEnum()在Status上优雅地实现fromString()方法。