我在执行这样的HQL查询时遇到了麻烦:
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();
ERROR 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, 第1行的Re.creditP'
<小时/> 的 2) 如果我用它执行它:
Query query = session.createQuery(sql).setResultTransformer(Transformers.aliasToBean(CoverDocumentReportView.class));
ArrayList<CoverDocumentReportView> li = (ArrayList<CoverDocumentReportView>)query.list();
错误将是:
ERROR 2012-12-22 14:51:46,709 [http-8080-1] org.hibernate.hql.ast.ErrorCounter:第1:224行:意外令牌:( ERROR 2012-12-22 14:51:46,709 [http-8080-1] org.hibernate.hql.ast.ErrorCounter:第1:308行:意外令牌:总和
有什么问题?
答案 0 :(得分:0)
SQL和HQL是两种不同的语言。
HQL不支持from子句中的子查询,因此该查询不能是HQL查询。
并且SQL不了解Java对象,并且没有允许创建它们的任何new()
函数,因此查询也不是有效的SQL查询。
使其成为有效的SQL查询,使用createSQLQuery()
执行它,然后遍历结果并从返回的行创建对象的实例。或者像你一样使用结果转换器,这将为你做到这一点。结果转换器将使用您分配给SQL查询的返回列的别名来为您创建bean。查询中不需要任何new CoverDocumentReportView()
来完成这项工作。阅读javadoc了解详情。