0

我在执行这样的 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();

错误 2012-12-22 14:16:19,838 [http-8080-1] org.hibernate.util.JDBCExceptionReporter:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '.datx.web.accounting.view.CoverDocumentReportView(Re.code AS fulCd, Re.creditP' 附近使用正确的语法


2) 如果我用这个执行它:

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

错误将是:

错误 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 行:意外令牌:总和

问题是什么?

4

1 回答 1

0

SQL 和 HQL 是两种不同的语言。

HQL 不支持 from 子句中的子查询,因此该查询不能是 HQL 查询。

并且 SQL 不知道 Java 对象,并且没有任何new()允许创建它们的函数,因此该查询也不是有效的 SQL 查询。

使其成为有效的 SQL 查询,使用 执行它createSQLQuery(),然后遍历结果并从返回的行创建对象的实例。或者像你正在做的那样使用结果转换器,它会为你做到这一点。结果转换器将使用您分配给 SQL 查询的返回列的别名来为您创建 bean。您不需要new CoverDocumentReportView()查询中的任何内容即可使其正常工作。有关详细信息,请阅读 javadoc。

于 2012-12-22T11:40:59.910 回答