HQL查询很简单

时间:2012-12-22 10:53:12

标签: mysql hibernate hql

我在执行这样的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行:意外令牌:总和

有什么问题?

1 个答案:

答案 0 :(得分:0)

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

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

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

使其成为有效的SQL查询,使用createSQLQuery()执行它,然后遍历结果并从返回的行创建对象的实例。或者像你一样使用结果转换器,这将为你做到这一点。结果转换器将使用您分配给SQL查询的返回列的别名来为您创建bean。查询中不需要任何new CoverDocumentReportView()来完成这项工作。阅读javadoc了解详情。