Hibernate Projection.sum () над перечислением - PullRequest
2 голосов
/ 07 июля 2010

Мне нужна помощь с Hibernate Projection.

У меня есть класс 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;
...
}

Перечисление Duration имеет методы getValue () и getInstanceByValue (). Значение является целым числом.

Мне нужно подвести итоги некоторых действий, которые соответствуют моим критериям. Мой 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, как я полагаю.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 30 ноября 2010

Я бы сопоставил карту столбца с дополнительным полем типа int.Это поле должно быть отображено как доступное только для чтения, чтобы избежать неоднозначности:

@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
   ...
}

Затем вы переписываете свой агрегированный запрос по следующим строкам:

detachedCriteria.setProjection(Projections.sum("durationNumeric"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...