Hibernate从2升级到3不支持Oracle8外连接(+)的解决办法 - 编程入门网
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |