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

2022-09-03 01:36:27

我的模型类(件):

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;
    }
}

正如你在上面看到的,我重写了string方法,但没有效果。数据库中的枚举存储为 或 。ACTIVEINACTIVE

附言:我使用休眠 jpa

感谢您的帮助!

附言我问,因为我写了REST服务来生成json(在json对象中最好使用小写,如果我没有记错的话)


答案 1

编写一个类,用 注释,实现 。有两种方法:converter@Converterjavax.persistence.AttributeConverter<YourEnum, String>

public String convertToDatabaseColumn(YourEnum attribute){..}
public YourEnum convertToEntityAttribute(String dbData) {..}

在那里,您可以应用大写/小写逻辑。

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


答案 2

下面是使用 AttributeConverter 的快速而实际的示例(在 JPA 2.1 中引入)

更新枚举类:

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());
    }
}

创建属性转换器:

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);
    }
}

如果设置为 true,则无需将批注添加到应转换的所有属性。否则,请应用转换器:autoApplyjavax.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
}