Hibernate从2升级到3不支持Oracle8外连接(+)的解决办法 - 编程入门网
Hibernate从2升级到3不支持Oracle8外连接(+)的解决办法时间:2011-08-31最近接手了一个要维护的项目,是用Hibernate2+Oralce8写成的,因为看到Hibernate3页出来这么久了,而且也感觉Hibernate3有它的许多新的特性,如批量删除和更新,新的HQL语法解析器AST。 升级过程大致按照孙卫琴的那篇文章 如何把Hibernate2.1升级到Hibernate3.0?来做,该替换的替换完,该设置的设置完,程序一跑,当程序执行到向下面这种查询的时候(Oracle所特有的外连接查询),报错。 语句为:(描述为类似语句,把项目中的实际表名隐去了) session.createQuery("select t1.c1,t2.c1 from Table1 t1,Table2 t2 where t1.c1=t2.c1(+)").list(); 出错信息为: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ) near line 1, column 106 [select t1.c1,t2.c1 from Table1 t1,Table2 t2 where t1.c1=t2.c1(+)]at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31)at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24)at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:258)at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623) 再回头看看孙卫琴的那篇升级注意事项中 1.3 查询语句的变化 提到Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器ASTQueryTranslator,它已经不支持像Oracle8i和Sybase11那样的 THETA-STYLE 连接查询方言。 解决这一问题的办法有两种: (1)改为使用支持ANSI-STYLE连接查询的方言,像 LEFT OUTER JOIN .. ON ..的写法 (2)也可改用 Hibernate2的查询翻译器,可在 hibernate.cfg.xml 中进行配置。 Hibernate从2升级到3不支持Oracle8外连接(+)的解决办法(2)时间:2011-08-31因第一种方法,需要在映射文件中配置PO 间的X 对X的关联关系才能用,如过哪位朋友在不配置 PO 间关联关系时也能用LEFT OUTER JOIN .. ON ..的写法连接查询,能告诉我怎么做的号吗?让咱也学一招,先谢了! 所以想想还是在 hibernate.cfg.xml 中配置 <property name= "query.factory_class"> org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property><property name= "query.factory_class"> org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 注:hibernate3默认的HQL语法翻译器的配置为: <property name= "query.factory_class"> org.hibernate.hql.classic.ASTQueryTranslatorFactory</property><property name= "query.factory_class"> org.hibernate.hql.classic.ASTQueryTranslatorFactory</property> 使用传统的hibe |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |