У меня есть следующий запрос, который он выполняет, и дает точный результат на сервере 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]
Как устранить это исключение.
Любая помощь будет оценена!!!
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()
.