Использование функций в качестве аргументов в функциях агрегации Hibernate - PullRequest
2 голосов
/ 19 января 2010

Я бы хотел выполнить следующий запрос на HQL:

select count(distinct year(foo.date)) from Foo foo  

Однако это приводит к следующему исключению:

org.hibernate.hql.ast.QuerySyntaxException: ожидая ЗАКРЫТЬ, найдено '(' возле линии 1, столбец 27

Похоже, что hibernate не позволяет использовать функции в качестве аргументов для своих функций агрегирования. Есть ли способ получить нужный результат?

Ответы [ 2 ]

0 голосов
/ 19 января 2010

С критериями API может использовать sqlProjection :

String func = format("count(distinct year(%s_.date))", criteria.getAlias());
String alias = "dateCol";
session.createCriteria(Foo.class).setProjection(
    sqlProjection(
        format("%s as %s", func, alias),
            new String[] { alias }, 
            new Type[] { Hibernate.LONG }
         )
     )
 );

Это должно работать. Я не проверял это.

Единственная проблема с проекцией sql состоит в том, что вы должны знать (т.е. повторять) имя столбца.

0 голосов
/ 19 января 2010
  1. Выберите всю дату
  2. Обведите результат и извлеките новую коллекцию, составленную из года, с каждой даты

Сначала это звучит неэффективно, но потом это просто дополнительный O (n), и я думаю, что N не такой большой.

Другой способ - использовать собственный запрос SQL.

...