processEqualityExpression (): Нет выражения для обработки! в hql

1

У меня есть следующий запрос, который он выполняет, и дает точный результат на сервере mssql.

SELECT count(Distinct(DATEPART(wk,spentDate))) FROM tblTimesheet where TimesheetStatus = 'Pending' and Approver = 6

Я написал эквивалентные критерии для вышеуказанного запроса ниже

Query query = sessionfactory.getCurrentSession().createQuery("SELECT count(Distinct(DATEPART(wk,spentDate))) FROM TblTimesheet where timesheetStatus =:status and tblUserDetailsByApprover =:app");
        query.setParameter("app", user);
        query.setParameter("status","Pending");
        List results = query.list();
        logger.info("size"+results.size());

Но я получаю следующее исключение

2014-11-24 12:50:48,310 ERROR org.hibernate.hql.PARSER.reportError:33 - line 1:22: unexpected token: (
    2014-11-24 12:38:11,502 WARN  org.hibernate.hql.ast.HqlParser.processEqualityExpression:203 - processEqualityExpression() : No expression to process!
    2014-11-24 12:38:11,503 INFO  com.uniphore.timesheet.controller.ApproveTimesheetController.getTimesheet:53 - Messageunexpected token: ( near line 1, column 22 [SELECT count(Distinct(DATEPART(wk,spentDate))) FROM com.uniphore.timesheet.domain.TblTimesheet where timesheetStatus =:status and tblUserDetailsByApprover =:app]

Как устранить это исключение.

Любая помощь будет оценена!!!

Теги:
sql-server
spring
hibernate
hql

1 ответ

4
Лучший ответ

HQL - это не SQL!

Проблема здесь в том, что вы используете встроенную функцию MSSQL DATEPART, это не функция HQL. Читайте об этом здесь: https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch16.html

Просто используйте собственный запрос:

Query query = sessionfactory.getCurrentSession().createSQLQuery(
    "SELECT count(Distinct(DATEPART(wk,spentDate))) " + 
    "FROM TblTimesheet where timesheetStatus = ? " + 
    "and tblUserDetailsByApprover = ?");
query.setParameter(0,"Pending");
query.setParameter(1, user);
logger.info("size"+query.getSingleResult());

Возможно, вам нужно изменить на позиционные параметры вместо имени!

Еще один момент: ваш результат равен размеру count, это всегда будет 1. Изменить list() на getSingleResult().

  • 0
    Спасибо Матиас, это сработало для меня.
  • 1
    спасибо ... я использовал параметризованный оператор, и это сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню