2010-07-07 106 views
2

我需要Hibernate投影的一些幫助。休眠在枚舉上的Projections.sum()

我有一個叫做Activity的類,它有一個屬性「duration」,它是一個Enum。持續時間是Oracle數據庫上的整數字段。我註釋了枚舉。


@TypeDefs({ 
    @TypeDef(
     name = "Duration", 
     typeClass = GenericEnumUserType.class, 
     parameters = { 
      @Parameter(name = "enumClass", value = "myproject.Duration"), 
      @Parameter(name = "identifierMethod", value = "getValue"), 
      @Parameter(name = "valueOfMethod", value = "getInstanceByValue") }) 
}) 
@Entity 
@Table(name = "activity") 
public class Activity { 
... 
private Duration duration; 
... 
} 

枚舉持續時間有方法getValue()和getInstanceByValue()。值是一個整數。

我需要總結一些Acitivities,這符合我的標準dutation。我的DetachedCriteria看起來是這樣的:


DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Activity.class); 
... 
detachedCriteria.setProjection(Projections.sum("duration")); 

當我執行將這個DetachedCriteria我得到以下ClassCastException異常:

myproject.Duration cannot be cast to java.lang.Integer

我如何可以總結在一個枚舉領域?它使用純SQL工作在數據庫上,因此它應該與我假設的hibernate一起工作。

感謝您的任何幫助。

回答

0

我會將映射列映射到一個類型爲int的附加字段。此字段必須爲只讀映射爲避免歧義:

detachedCriteria.setProjection(Projections.sum("durationNumeric")); 

@Entity 
@Table(name = "activity") 
public class Activity { 
    ... 
    private Duration duration; 

    @Column(name = "duration", updatable = false, insertable = false) //mapped to the same columnn! 
    private int durationNumeric 
    ... 
} 

然後你沿着這些線路重寫聚集查詢