快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
rnat2所用的HQL语法翻译器。然后程序再跑一跑,刚刚那个(+)的地方是没有错了,可是新麻烦有冒起来了,程序执行到

session.createQuery("delete User u where u.name=''Unmi''").executeUpdate();

有报错了:

org.hibernate.QueryException: query must begin with SELECT or FROM: delete [delete com.unmi.User where u.name=''Unmi'']

原来旧的HQL语法解析器不支持 delete User 的写法,hibernate2在删除持久化对象时必须写成

session.delete("delete User u where u.name=''Unmi''");

然而新的 org.hibernate.Session 的接口方法已去除了 Session.delete(String hql)方法,看来这条路也是受阻了。正是两头受难,无奈之时暂时放弃了升级的念头,把该还原的地方都恢复旧模样了。

过了好一段时间,也就是个把月吧……

心里总也觉不甘心,觉得事情总有解决的办法,于是采用了终极办法:从原代码下手,进行单步的跟踪,看看hibernate3何时进行HQL到SQL的转换,何时取用配置的语法翻译器。

下面要解决的一个课题就是:

如何让Hibernate3既能使用新的Delete和Update语法,又能使用 Oracle Theta-Style 的 t1.c1=t2.c1(+)外连接写法

其中的语法翻译器如何把传入的一条HQL语句拆解进行分析这里就不详叙,不过最好还是要明白一点:

Classic语法翻译器会把传入的t1.c1=t2.c1(+)中的(+)作为一个整体,不拆开来,而AST语法分析器却会把其中的(+)依括号拆成 ”(” , ”+” , ”)”三部分。

Hibernate从2升级到3不支持Oracle8外连接(+)的解决办法(3)

时间:2011-08-31

我们首先来看看HQL语法翻译工厂接口 QueryTranslatorFatory 有两个接口方法:

public QueryTranslator createQueryTranslator(String queryIdentifier, String queryString,    Map filters, SessionFactoryImplementor factory);public QueryTranslator createFilterTranslator(String queryIdentifier, String queryString,    Map filters, SessionFactoryImplementor factory);public QueryTranslator createQueryTranslator(String queryIdentifier, String queryString, Map filters, SessionFactoryImplementor factory);public QueryTranslator createFilterTranslator(String queryIdentifier, String queryString, Map filters, SessionFactoryImplementor factory);

调用以上两个方法只在类 HQLQueryPlan的构造函数中(五个参数的那个)

protected HQLQueryPlan(String hql, String collectionRole, boolean shallow,    Map enabledFilters, SessionFactoryImplementor factory){......}protected HQLQueryPlan(String hql, String collectionRole, boolean shallow,    Map enabledFilters, SessionFactoryImplementor factory){......}

这个构造函数接收你写的HQL语句还有一个 SessionFactoryImplementor (extends SessionFactory),这个SessionFactory持有hibernate.cfg.xml的配置项HQL语法翻译器。

读这个构造函数的代码,我们发现有两段代码

translators[i] = factory.getSettings().getQueryTranslatorFactory()        .createQueryTranslator(hql,concreteQueryStrings[i],enabledFilters, factory );translators[i] = factory.getSettings().getQueryTranslatorFactory()        .createFilterTranslator(hql, concreteQueryStrings[i], enabledFilters, factory );translators[i] = factory.getSettings().getQueryTranslatorFactory()        .createQueryTranslator(hql,concreteQueryStrings[i],enabledFilters

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号