2015-06-22 115 views
2

我想要將Enum的值與hibernate映射以從數據庫中獲取數據。 在數據庫列**EASE_RATING** is number[1]。我可以將數據保存在數據庫中。使用Hibernate映射枚舉值

但是當我通過Criteria.list檢索數據()我得到easeRating =兩個代替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; 

UPDATE

我想在int該值序()]在休眠列表()。 我正在通過休眠數據庫。

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

我可以實現價值throgh **getValue()**

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

但我將如何得到這個在Hibernate中的list()

+1

該屬性是類型的評級。所以你得到的不是「兩個」。這是評級「Rating.Two」的實例。您可以在此實例上調用getValue()以獲取其值。 –

回答

2

休眠工作正常。你的問題是關於枚舉。 toString()默認實現返回枚舉的名稱。這個名字是enum的字面意思:「一」,「兩」等等......

如果你想獲得一個枚舉的序號和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()); 
+0

更新:我想在休眠列表() –

0

我不知道爲什麼你需要原始數據庫數據;我的建議是,您應該始終使用Rating枚舉,並在您需要的情況下從其實例中獲取序號/值。

然而,解決方案,以滿足您的要求的一個可能是另一個實體映射到相同的表具有以下映射:

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

還包括任何其他所需的列在這個實體(你使用的列在這個用例中)。然後在查詢中使用這個實體。