2012-12-22 6 views
0

Я имею проблемы с выполнением запроса HQL, как это:Простые трудности с HQL Query

select new myPackage.view.CoverDocumentReportView(Re.code AS fulCd, 
Re.creditPrice AS crtprc, 
Re.debitPrice AS dbtprc, 
(Re.debitPrice - Re.debitPrice) AS redbtprc, 
(Re.creditPrice- Re.creditPrice) AS recrtprc, 
(Re.debitPrice-Re.creditPrice) AS rem) 
from 
(select fullCode as code, 
    sum(creditPrice) as creditPrice , 
    sum(debitPrice) as debitPrice 
from DocumentMaster DM, 
    DocumentAccount DA, 
    Tree    T , 
    AccountTree  AT, 
    DocumentDetailed DD 
where DM.id = DA.documentMaster and 
     DA.accountTree = T.id  and 
     DA.accountTree = AT.id  and 
     DD.documentAccount = DA.id 
group by DA.accountTree) As Re 


1) Если я выполнить это так:

SQLQuery crit = (SQLQuery) session 
      .createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(CoverDocumentReportView.class)); 
ArrayList<CoverDocumentReportView> li = (ArrayList<CoverDocumentReportView>) crit.list(); 

ОШИБКА 2012-12-22 14: 16: 19,838 [http-8080-1] org.hibernate.util.JDBCExceptionReporter: у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «.datx.web.accounting.view.CoverDocumentReportView (Re.code AS fulCd, Re.creditP» в строке 1


2) Если я исполню ее с этим:

Query query = session.createQuery(sql).setResultTransformer(Transformers.aliasToBean(CoverDocumentReportView.class)); 
ArrayList<CoverDocumentReportView> li = (ArrayList<CoverDocumentReportView>)query.list(); 

ошибка будет:

ER ROR 2012-12-22 14: 51: 46,709 [http-8080-1] org.hibernate.hql.ast.ErrorCounter: строка 1: 224: неожиданный токен: ( ОШИБКА 2012-12-22 14: 51: 46,709 [ http-8080-1] org.hibernate.hql.ast.ErrorCounter: строка 1: 308: неожиданный токен: сумма

В чем проблема?

+0

Возможно, вы захотите увидеть здесь http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html –

+0

Кстати, с учетом регистра не было проблем. –

ответ

0

SQL и HQL - это два разных языка.

HQL не поддерживает подзапросы из предложений, поэтому этот запрос не может быть запросом HQL.

И SQL не знает о объектах Java и не имеет функции new(), позволяющей их создавать, поэтому запрос также не является допустимым SQL-запросом.

Сделайте его действительным SQL-запросом, выполните его с помощью createSQLQuery(), затем выполните итерацию результатов и создайте экземпляры ваших объектов из возвращаемых строк. Или используйте трансформатор результатов, как вы делаете, что сделает это за вас. трансформатор результата будет использовать псевдонимы, которые вы назначили возвращенным столбцам SQL-запроса, для создания beans для вас. Вы не нуждаетесь в new CoverDocumentReportView() в запросе, чтобы сделать эту работу. Подробнее читайте в javadoc.

+0

Спасибо за помощь. Однако изменить его на SQL здесь не вариант. Как я могу заставить его работать с HQL? Кажется, что HQL поддерживает подзапросы. Я сделаю необходимые изменения. –

+0

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-subqueries: * Обратите внимание, что подзапросы HQL могут встречаться только в предложениях select или where. * –

+0

Я вижу, но есть ли способ получить мой желаемый оператор SQL, безопасно преобразованный в HQL? Достаточно ссылки или подсказки. –

Смежные вопросы