最近老大給個任務,他在使用HQL語言進行數據查詢的時候使用了case when,運行之后並沒有執行,反而報錯,提示不識別case
於是交給我解決,查找資料顯示,hibernate有個查詢解析器,需要配置,各個版本提示如下:
Hibernate3.0 采用新的基於ANTLR的HQL/SQL查詢翻譯器,不過,Hibernate2.1的查詢翻譯器也依然存在。在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
提示:ANTLR是用純Java語言編寫出來的一個編譯工具,它可生成Java語言或者是C++的詞法和語法分析器,並可產生語法分析樹並對該樹進行遍歷。ANTLR由於是純Java的,因此可以安裝在任意平台上,但是需要JDK的支持。
Hibernate開發小組盡力保證Hibernate3.0的查詢翻譯器能夠支持Hibernate2.1的所有查詢語句。不過,對於許多已經存在的應用,在升級過程中,也不妨仍然使用Hibernate2.1的查詢翻譯器。
值得注意的是, Hibernate3.0的查詢翻譯器存在一個Bug:不支持某些theta-style連結查詢方言:如Oracle8i的 OracleDialect方言、Sybase11Dialect。解決這一問題的辦法有兩種:(1)改為使用支持ANSI-style連結查詢的方言,如 Oracle9Dialect,(2)如果升級的時候遇到這一問題,那么還是改為使用Hibernate2.1的查詢翻譯器。
於是我在項目中加上了hibernate3.0的配置方式,但是這個時候問題來了,提示我找不到 org.hibernate.hql.ast.ASTQueryTranslatorFactory
於是各種百度,結果顯示需要使用antlr的jar包,但是項目中已經包含jar包,然后各種郁悶
仔細看過項目之后了解,這個項目用的是hibernate4版本以上,解析器配置采用的是默認的配置,可是還是解決不了
然后把我的hql語句 String hql = "from Event as e where case e.viewPermission when 1 then 1=1 when 0 then e.id in (select er.eventID as id from EventRecord as er where er.openID = 1) else 1=1 end"; 中的case when 放到了from 前面 結果可以執行,不報錯
最后了解 hql支持簡單的case when 。。。。
然后郁悶透頂,最近在hql語言中使用時間函數,也是不支持。。。。