快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
, factory );translators[i] = factory.getSettings().getQueryTranslatorFactory()        .createFilterTranslator(hql, concreteQueryStrings[i], enabledFilters, factory );

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

时间:2011-08-31

它们的职能是获取SessionFactory (hibernate.cfg.xml)所配置的HQL语法分析器,这也就是我们的切入点,我们所希望的事情是:

当构造HQLQueryPlan时,发现传给的hql是一个Oracle 那样的THETA-STYLE 连接查询语句(即像有(+)那样的语句),我们就绕开在 hibernate.cfg.xml 所配置的AST HQL语法翻译器,而是采用能够理解这种语法的传统的语法翻译器。

因此我们只要把 HQLQueryPlan类的这个构造函数中的

if ( collectionRole == null) { …………………………… }

改为如下:

if (collectionRole == null) {  // 如果hql语句中使用Oralce式的外连接方式就用传统的语法翻译器   if (hql.replaceAll("  s*", "").indexOf("(+)") != -1) {    translators[i] = new ClassicQueryTranslatorFactory().createQueryTranslator(hql,        concreteQueryStrings[i], enabledFilters, factory);  } else {    translators[i] = factory.getSettings().getQueryTranslatorFactory()        .createQueryTranslator(hql, concreteQueryStrings[i], enabledFilters,            factory);  }  translators[i].compile(factory.getSettings().getQuerySubstitutions(), shallow);} else {  // 如果hql语句中使用Oralce式的外连接方式就用传统的语法翻译器   if (hql.replaceAll("  s*", "").indexOf("(+)") != -1) {    translators[i] = new ClassicQueryTranslatorFactory().createFilterTranslator(hql,        concreteQueryStrings[i], enabledFilters, factory);  } else {    translators[i] = factory.getSettings().getQueryTranslatorFactory()        .createFilterTranslator(hql, concreteQueryStrings[i], enabledFilters,            factory);  }  ((FilterTranslator) translators[i]).compile(collectionRole, factory.getSettings()      .getQuerySubstitutions(), shallow);}if (collectionRole == null) {// 如果hql语句中使用Oralce式的外连接方式就用传统的语法翻译器if (hql.replaceAll("  s*", "").indexOf("(+)") != -1) { translators[i] = new ClassicQueryTranslatorFactory().createQueryTranslator(hql,  concreteQueryStrings[i], enabledFilters, factory);} else { translators[i] = factory.getSettings().getQueryTranslatorFactory()  .createQueryTranslator(hql, concreteQueryStrings[i], enabledFilters,   factory);}translators[i].compile(factory.getSettings().getQuerySubstitutions(), shallow);} else {// 如果hql语句中使用Oralce式的外连接方式就用传统的语法翻译器if (hql.replaceAll("  s*", "").indexOf("(+)") != -1) { translators[i] = new ClassicQueryTranslatorFactory().createFilterTranslator(hql,  concreteQueryStrings[i], enabledFilters, factory);} else { translators[i] = factory.getSettings().getQueryTranslatorFactory()  .createFilterTranslator(hql, concre

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