【问题标题】:Mapping Enum value with Hibernate使用 Hibernate 映射枚举值
【发布时间】:2015-06-22 10:48:58
【问题描述】:

我想用 hibernate 映射 Enum 的值,以便从 DB 中获取数据。 在数据库列**EASE_RATING** is number[1]。我能够将数据库中的数据保存为数字。

但是当我通过 Criteria.list() 检索数据时,我得到 easeRating=Two 而不是 easeRating=2

我的问题是如何以序数或枚举值的形式获取数据。

public enum Rating {

    Zero(0), // [No use] Taken Zero B'Coz Ordinal starts with 0
    One(1),
    ...
    Five(5);

    private final int value;

    Rating(int value){
        this.value = value;
    }

    public int getValue(){
        return this.value;
    }

    public static Rating getRating(int x) {
        switch(x) {
            case 1: return One; ...
            case 5: return Five;
        }
        return One;
    }
}

POJO:

@Enumerated(EnumType.ORDINAL)
@Column(name = "EASE_RATING", nullable = false)
private Rating easeRating;

更新

我想要 Hibernate List() 中 int[ordinal()] 中的这个值。 我正在通过休眠访问 DB。

List<CustomerFeedback> result = criteria.list();

我可以通过**getValue()**实现价值

System.out.println(Rating.Five.getValue()); // 5
System.out.println(Rating.Five);            // Five
System.out.println(Rating.Five.name());     // Five

但是我如何在 Hibernate list() 中得到这个

【问题讨论】:

  • 该属性的类型为 Rating。所以你得到的不是“二”。这是评级Rating.Two 的实例。你可以在这个实例上调用 getValue() 来获取它的值。

标签: java hibernate jpa enums


【解决方案1】:

休眠运行良好。你的问题是关于枚举。 toString() 默认实现返回枚举的名称。名称是枚举的字面量:“One”、“Two”等...

如果你想获得一个以 1 表示的枚举的序数,你必须创建一个新方法,因为 ordinal() 是最终的:

    /**
     * One-starting index enumeration
     */
    public enum Rating {

        One, Two, Three, Four;

        public int position() {
            return ordinal() + 1;
        }

        public static Rating getRating(int x) {
            return Rating.values()[x - 1];
        }

        public static void main(String args[]) {
            Rating one = Rating.One;
            System.out.println("ToString() (name): " + one);
            System.out.println("Ordinal position stating in 1: " + one.position());
        }

    }

更新1的答案: 为什么不将评级列表映射到值列表?

    List<Rating> ratings = Arrays.asList(Rating.values());
    List<Integer> ints = ratings.stream()
            .mapToInt(Rating::position)
            .boxed()
            .collect(Collectors.toList());

【讨论】:

  • 更新:我想在 Hibernate list() 中使用这个
【解决方案2】:

我不确定您为什么需要原始数据库数据;我的建议是,您应该始终使用 Rating 枚举,并在需要的用例中从其实例中获取序数/值。

但是,满足您要求的解决方案之一可能是使用以下映射将另一个实体映射到同一个表:

@Column(name = "EASE_RATING", nullable = false)
private Integer easeRating;

还要在此实体中包含任何其他所需的列(您在此用例中使用的列)。然后在查询中使用这个实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2018-04-11
    • 2023-03-20
    相关资源
    最近更新 更多