Проблема с использованием вложенной агрегатной функции avg(..) в hibernate hql

Я использую HQL для получения данных через класс DAO, но он выдает ошибку, указанную ниже:

ERROR org.hibernate.hql.PARSER  - <AST>:0:0: unexpected AST node: query

Ниже мой Hql-запрос:

select new com.shaikh.dto.UserResult ( user.userSurName, avg((select avg(v1.age)  from com.shaikh.dto.UserResult v1  where v1.joinDate between to_date(:dayFirst, 'dd-Mon-yy') and to_date(:dayLast, 'dd-Mon-yy') )),  avg(user.age) ) from com.shaikh.dto.User user group by user.userSurName";

String [] paramNames = { "dayFirst", "dayLast" };
Object [] values = { firstDay,lastDay};
return getHibernateTemplate().findByNamedParam(queryString, paramNames, values);

Я использую Oracle 11g в качестве базы данных.

Если я заменю вложенную функцию avg() простой avg(user.age) для тестирования, она будет работать нормально, поэтому кажется, что сопоставления классов работают нормально. Хотя я получаю сообщение об ошибке, как указано выше, которое сообщает, что запрос hql неверен. Я не уверен, как я могу это исправить. Заранее спасибо :)

Спасибо и с уважением,
Шарик


person Sariq Shaikh    schedule 28.09.2010    source источник


Ответы (2)


Вы комбинируете HQL с SQL

to_date(:dayFirst, 'dd-Mon-yy') and to_date(:dayLast, 'dd-Mon-yy')

передать эти параметры в качестве аргументов даты.

person Damian Leszczyński - Vash    schedule 28.09.2010
comment
Он передается как дата с использованием массива объектов, см. именованные значения массива объектов. Здесь firstDay и lastDay являются объектами java.util.Date Object [] values ​​= { firstDay,lastDay}; - person Sariq Shaikh; 29.09.2010
comment
Так что вам не нужно приводить эти значения к оракулу;). Кстати. В этом же коде невозможно сказать, какого типа эти значения. - person Damian Leszczyński - Vash; 29.09.2010

Вам не нужно использовать avg дважды... вот правильный HQL:

select new com.shaikh.dto.UserResult ( user.userSurName, (select avg(v1.age)  from com.shaikh.dto.UserResult v1  where v1.joinDate between :dayFirst and :dayLast),  avg(user.age) ) from com.shaikh.dto.User user group by user.userSurName";

И передать dayFirst и dayLast как java.util.Date

person user461935    schedule 29.09.2010