如何将枚举类型存储为小写字符串?

eug*_*nes 13 java enums persistence hibernate jpa

我的模特课(作品):

public class User ... {

    @Enumerated(STRING)
    private Status status;

    ...

    public enum Status {

        ACTIVE,
        INACTIVE;

        @Override
        public String toString() {
            return this.name().toLowerCase();
        }
    }

    ...

    public String getStatus() {
        return status.name().toLowerCase();
    }

    public void setStatus(Status status) {
        this.status = status;
    }
}
Run Code Online (Sandbox Code Playgroud)

如上所示,我重写了toString方法,但没有效果.枚举存储在数据库中为ACTIVEINACTIVE.

PS我使用hibernate jpa

感谢帮助!

PSS我问,因为我编写生成json的REST服务(在json对象中更好地使用小写,如果我没有错误)

Ken*_*ent 9

写一个converter带有注释的类@Converter,它实现了javax.persistence.AttributeConverter<YourEnum, String>.有两种方法:

public String convertToDatabaseColumn(YourEnum attribute){..}
public YourEnum convertToEntityAttribute(String dbData) {..}
Run Code Online (Sandbox Code Playgroud)

在那里你可以应用你的大/小写逻辑.

稍后您可以注释您的字段,以便使用给定的转换器.

  • @布卡对吧!另请注意,如果使用“@Convert”,则应删除“@Enumerated”,否则转换器将被忽略 (2认同)

naX*_*aXa 9

这是一个快速实用的使用示例(在 JPA 2.1 中引入)AttributeConverter

更新您的枚举类:

public enum Status {
    ACTIVE,
    INACTIVE;

    public String toDbValue() {
        return this.name().toLowerCase();
    }

    public static Status from(String status) {
        // Note: error if null, error if not "ACTIVE" nor "INACTIVE"
        return Status.valueOf(status.toUpperCase());
    }
}
Run Code Online (Sandbox Code Playgroud)

创建属性转换器:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {
    @Override
    public String convertToDatabaseColumn(Status status) {
        return status.toDbValue();
    }

    @Override
    public Status convertToEntityAttribute(String dbData) {
        return Status.from(dbData);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果autoApply设置为true,则不需要将javax.persistence.Convert注释添加到所有要转换的属性中。否则,应用转换器:

import javax.persistence.Convert;
import javax.persistence.Entity;

@Entity
public class User {

    @Convert(converter = StatusConverter.class)
    @Enumerated(STRING)
    private Status status;

    // ... other fields, constructor(s), standard accessors
}
Run Code Online (Sandbox Code Playgroud)