当前位置: 首页 > 知识库问答 >
问题:

如何设置枚举字段为整数通过Hibernate到db?

龙昊焱
2023-03-14

我有整数列作为"状态"在我的数据库。

我的枚举类:

public enum MemberStatus {
   PASSIVE(0),ACTIVE(1);

   private int value;

   private MemberStatus(int value) {
      this.value = value;
   }

   public int getValue() {
      return value;
   }

}

我的实体字段:

@Column(name = "status", nullable = false)
@Enumerated(EnumType.ORDINAL)
private MemberStatus status;

Hibernate日志:

组织。postgresql。util。PSQLException:错误:“status”列的类型为integer,但表达式的类型为bytea。提示:您需要重写或强制转换表达式。二进制数据

我使用PostgreSQL。如何解决这个问题?有什么想法吗?

共有1个答案

聂炜
2023-03-14

我建议你用转换器。

这是我想到的最干净的解决方案,因为:

  • 在向枚举添加值的顺序或重构枚举元素名称时,您不再有问题
  • 您可以更灵活地选择列的数据库类型

您可以将该字段定义为:

@Column(name = "status", nullable = false)
@Convert(converter = MemberStatusEnumConverter.class)
private MemberStatus status;

枚举变得更简单:

public enum MemberStatus {
   PASSIVE,
   ACTIVE;
}

以及您的转换器类MemberStatusEnumConverter:

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

@Converter
public class MemberStatusEnumConverter implements    
AttributeConverter<MemberStatus,Integer>{
    @Override
    public Integer convertToDatabaseColumn(MemberStatus attribute) {
        switch (attribute) {
            case PASSIVE:
                return new Integer(0);
            case COUNTYLEVEL:
                return new Integer(1);
            default:
                throw new IllegalArgumentException("Unknown" + attribute);
        }
    }

    @Override
    public MemberStatus convertToEntityAttribute(Integer dbData) {
        if (dbData == 0){
            return MemberStatus.PASSIVE;
        } else if (dbData == 1){
            return MemberStatus.ACTIVE;
        }
        else{
            throw new IllegalArgumentException("Unknown" + dbData);
        }
    }
}

本文描述了我为您的示例实现的解决方案。

 类似资料:
  • 问题内容: 我试图确定如何访问JObject中的数据,但我终生无法确定如何使用它。 我可以将其打印到执行Console.WriteLine(Object)的控制台中,然后看到数据,它看起来像: 但是我不知道如何迭代/枚举它,任何人都有想法吗?我现在很茫然。 问题答案: 如果您查看相关文档,将会发现它实现了。因此,您可以使用以下命令简单地对其进行迭代:

  • 使用上面的代码,我可以根据枚举值获取字段的值。现在如何设置字段的基于值例如:如果被选中,那么我需要设置到输入值。

  • 问题内容: 具有内部字段的枚举,有点像地图。 现在,我需要按其内部字段枚举。 写下: 但是,每次需要查找适当的实例时,对所有枚举进行查找并不是非常有效。 还有其他方法可以做到吗? 问题答案: 您可以将a 与初始化程序一起使用,该初始化程序将使用由其字段键入的值来填充它。 请注意,已完成,也已完成。 您现在可以期望是一个操作。 参考文献 JLS 8.7静态初始值设定项 JLS 8.9枚举 注意 该方

  • 我在使用SpringData/Hibernate按自定义规则对枚举进行排序时遇到了一些小问题。 A有一个名为DeviceState的枚举,它有自己的优先级字段。 枚举由DeviceEntity使用: 有线索吗,救命?点子?请记住,这是生产工作系统,我不能做任何“烟火”。

  • 我试图在Avro模式中创建Union字段,并用它发送相应的JSON消息,但要有一个字段-。 https://avro.apache.org/docs/1.8.2/spec.html#工会 具有相应JSON数据的最简单联合类型(avro模式)的示例是什么?(尝试制作不含NULL/空数据的示例和含NULL/空数据的示例)。

  • 如何在常量参数中传递类型值?在这种情况下,此参数仅适用于PARS()常量。 更新:我最终没有在帖子中提到它,但它是一个对象列表,而不是一个字符串。