Mysql HQL查询的简单困难
执行HQL查询时遇到如下问题:Mysql HQL查询的简单困难,mysql,hibernate,hql,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.credi
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();
sqlquerycrit=(SQLQuery)会话
.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(CoverDocumentReportView.class));
ArrayList li=(ArrayList)crit.list();
错误2012-12-22 14:16:19838[http-8080-1]org.hibernate.util.jdbceptionReporter:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用接近“.datx.web.accounting.view.CoverDocumentReportView(Re.code AS fulCd,
关于第1行的creditP'
2) 如果我用这个执行它:
Query query = session.createQuery(sql).setResultTransformer(Transformers.aliasToBean(CoverDocumentReportView.class));
ArrayList<CoverDocumentReportView> li = (ArrayList<CoverDocumentReportView>)query.list();
Query Query=session.createQuery(sql).setResultTransformer(Transformers.aliasToBean(CoverDocumentReportView.class));
ArrayList li=(ArrayList)query.list();
错误将是:
错误2012-12-22 14:51:46709[http-8080-1]org.hibernate.hql.ast.ErrorCounter:第1行:224:意外令牌:(
错误2012-12-22 14:51:46709[http-8080-1]org.hibernate.hql.ast.ErrorCounter:第1行:308:意外令牌:总和
问题出在哪里?SQL和HQL是两种不同的语言 HQL不支持from子句中的子查询,因此此查询不能是HQL查询 SQL不知道Java对象,也没有任何允许创建它们的
new()
函数,因此该查询也不是有效的SQL查询
使其成为有效的SQL查询,使用
createSQLQuery()执行它
,然后遍历结果并从返回的行中创建对象的实例。或者在执行此操作时使用结果转换器,这将为您做到这一点。结果转换器将使用您分配给SQL查询返回列的别名为您创建bean。您不需要任何新的CoverDocumentReportView()
在查询中实现该功能。有关详细信息,请阅读javadoc。您可能希望在此处看到,顺便说一句,区分大小写不是问题所在。感谢您的帮助。但是,将其更改为SQL在此处不是一个选项。如何使其与HQL一起工作?HQL似乎支持子查询。我将进行任何必要的更改。:注意HQL子查询只能出现在select或where子句中。我明白了,但是有没有办法将我想要的SQL语句安全地转换为HQL?一个链接或提示就足够了。请注意,HQL子查询只能出现在select或where子句中。这意味着您不能在from
子句中有子查询。因此,不,此查询无法翻译d到HQL,因为from
子句不是select
子句,也不是where
子句。我看不出它怎么会更清楚。相信我:我明白了:-)你不必每次都重复它。我想我最好考虑一下如何编写这个不带from子句的sql,使其能够转换为hql
。