关于hibernate中使用case when 和函数,查询解析配置的问题

最近老大给个任务,他在使用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语言中使用时间函数,也是不支持。。。。

posted @ 2015-11-26 12:16  梁海洋  阅读(3179)  评论(0编辑  收藏  举报