快速业务通道

Hibernate从2升级到3不支持Oracle8外连接(+)的解决办法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号