天天看點

org.hibernate.QueryException: , expected in

 org.hibernate.QueryException: , expected in SELECT [SELECT NEW com.coscon.cbs.domain.result.settlement.SettlementCommissionSumDetailResult (companys.companyNameCn as companyNameCn,commCntr.containerSizeType as containerSizeType, companyChargeCode.settlementChargeCodeDescription as settlementChargeCodeDescription, commCntr.commissionCurrencyCode as commissionCurrencyCode ,commCntr.commissionAmount as commissionAmount, COUNT(1) as containerNumbers,SUM(commCntr.commissionAmount) as commissionAmounts) FROM com.coscon.cbs.domain.model.settlement.SettlementHead  settlementHead, com.coscon.cbs.domain.model.settlement.CommissionBill commBl, com.coscon.cbs.domain.model.settlement.SettlementAR settlementAR, com.coscon.cbs.domain.model.settlement.SettlementDocumentCommissionContainer commCntr, com.coscon.cbs.domain.model.master.Company companys, com.coscon.cbs.domain.model.master.CompanyChargeCode companyChargeCode WHERE commBl.billBasicUuid=:businessReferenceUuid AND commBl.companyCode =:companyCode AND commBl.commissionMode=:chargeCodeGroup AND commBl.commissionType=:chargeCode AND commBl.rateCurrencyCode=settlementAR.currencyCode AND commBl.actualFlag=:actualFlag AND settlementAR.settlementDocumentArItemUuid =:settlementDocumentArItemUuid AND settlementAR.currencyCode =:currencyCode AND settlementAR.settlementDocumentHeadUuid = settlementHead.settlementDocumentHeadUuid AND commBl.billBasicUuid = settlementHead.businessReferenceUuid AND commBl.companyCode =settlementHead.companyCode AND commBl.commissionMode=settlementAR.chargeCodeGroup AND commBl.commissionType=settlementAR.chargeCode AND commBl.companyCode = commCntr.companyCode AND commBl.commissionMode = commCntr.commissionMode AND commBl.agencyCode = commCntr.agencyCode AND commBl.billBasicUuid = commCntr.billBasicUuid AND companys.companyCode = commCntr.companyCode AND companyChargeCode.companyCode = commCntr.companyCode AND companyChargeCode.chargeCode = commCntr.commissionType GROUP BY ( companys.companyNameCn,commCntr.containerSizeType,companyChargeCode.settlementChargeCodeDescription, commCntr.commissionCurrencyCode,commCntr.commissionAmount)]

            at org.hibernate.hql.classic.SelectParser.token(SelectParser.java:203)      
            at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:109)      
            at org.hibernate.hql.classic.ClauseParser.end(ClauseParser.java:136)      

出現這種情況跟你使用的hibernate的 版本的解析器有關.. 

還有就是跟你使用的方式有關.. 如.. 有 map 的方式 和 定制結果集的方式.. 進行的話,相對來說.map 的方式是最快的.. 但是有時候,我們的架構中定義死了. 如在weblogic中部署的問題  如,中文問題 等等.. 會将hibernate的解析器換成較低的版本

org.hibernate.QueryException:ClassNotFoundException:org.hibernate.hql.ast.HqlToken錯誤之解決辦法 

org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken

解決辦法:

在Hibernate.hbm.xml中加入加入屬性:

<property name="hibernate.query.factory_class">

        org.hibernate.hql.classic.ClassicQueryTranslatorFactory

</property>

原因: 

Hibernate3.0 采用新的基于ANTLR的HQL/SQL查詢翻譯器,在Hibernate的配置檔案中,hibernate.query.factory_class屬性用來選擇查詢翻譯

器。 

(1)選擇Hibernate3.0的查詢翻譯器: 

hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory 

(2)選擇Hibernate2.1的查詢翻譯器 

hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory 

為了使用3.0的批量更新和删除功能,隻能選擇(1)否則不能解釋批量更新的語句,當使用的時候出現了不支援條件輸入中文的情況。選擇(2

)可以支援輸入中文,但沒法解釋批量更新語句了 

在hibernate3中需要用到antlr,然而這個包在weblogic.jar中已經包含了antrl類庫,就會産生一些類加載的錯誤,無法找到在war或者ear中

的hibernate3.jar。 

出現這個錯誤之後,antlr會調用System.exit(),這樣weblogic就會中止服務。 

解決方法: 

1.是在hibernate.properties檔案中增加屬性:hibernate.query.factory_class,屬性的值是

org.hibernate.hql.classic.ClassicQueryTranslatorFactory,這樣就可以解決問題了。 

但是部分功能會有問題,譬如 

但本系在批量删除和更新會有問題,本系統不采用 

2.将antlr-2.7.5H3.jar到Weblogic的pre_Classpath :用WinRar或Winzip打開C:\bea\weblogic81\server\lib\weblogic.jar 删除裡面的antlr

目錄, 然後再antlr-2.7.5H3.jar放在weblogic.jar的同一目錄(注:替換之後沒做做過嚴格測試,尚不知是否有後遺症) 

3. 1、拷貝Hibernate3裡帶的包antlr-2.7.5H3.jar到%WL_HOME%\server\lib下 

2、修改% mydomain% \ startWebLogic.cmd : 

在set CLASSPATH之前加上下面一句: 

set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.5H3.jar; 

在set CLASSPATH之後加上下面一句: 

set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH% 

一切OK!

繼續閱讀