hibernate3 高手进来帮忙,关于HQL 转换成SQL的问题。

programeyonger 2010-01-13 02:20:24
大概是这样的,在优化报表的时候,系统有一个需求,想用jdbc代替hibernate,但是这个系统里有些代码是hibernate来做的,或者说在我需要优化的地方,有很多HQL的代码,我现在想把这个HQL转换成SQL。
1. hibernate2 的简单优化方案:

QueryTranslator translator = new QueryTranslator(hqlStr);
translator.compile((SessionFactoryImplementor)db.getDBSession().getSessionFactory(), Collections.EMPTY_MAP, false);
String newString =translator.getSQLString();
后来发现不行,因为hqlStr里面的内容是
select Employee from Employee in class com.technodex.evodex.apps.bo.Employee where Employee.deleted = 0 and Employee.companyId in ('MYDIN')

无法转换,但是要是把hql的内容改成select from Employee是可以转换的,我估计是这个translator的分析功能有限。
我就换成了hibernate3 的AST 优化,请看方案2

2. Hibernate3的AST 语句分析方案
HqlParser parser =HqlParser.getInstance(hqlStr);
AST ast =parser.getAST();
SessionFactoryImplementor sf = (SessionFactoryImplementor)(db.getDBSession().getSessionFactory());
String newString =generate(ast, sf);

-----
private String generate(AST sqlAst,SessionFactoryImplementor factory) throws QueryException, RecognitionException
{
System.out.println("************generate begin");

SqlGenerator gen = new SqlGenerator(factory);
gen.statement(sqlAst);
System.out.println("--generate1");
System.out.println(gen.getSQL());
System.out.println("--generate2");
String sql = gen.getSQL();
return sql;
} //发现始终无法打印出我想要的SQL 结果。
3. 在google和百度上搜索了半天 只找到了一点
HqlSqlWalker w = new HqlSqlWalker(QueryTranslatroImpl,sessionFactory,HqlParser,Map,CollectionRole);//不知道怎么设置这些参数
AST hqlAst = parser.getAST();
w.statement( hqlAst );
第三个方案,因为不知道构造参数,所以始终无法获得HqlSqlWalker

所以上来求救,问题: 1. 如何构造一个HqlSqlWalker 对象, 2.假如没有的话,是否还有其他方案?



...全文
303 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyjava1984 2010-01-15
  • 打赏
  • 举报
回复
直接写sql还要好些, 你这样转来转去影响性能
javayisheng 2010-01-15
  • 打赏
  • 举报
回复
学习ing……
owen_008 2010-01-14
  • 打赏
  • 举报
回复
非常好~~~~~~~~~~~~~~~~~~~~~~~~~~我顶
wenjjing2lianee 2010-01-14
  • 打赏
  • 举报
回复
不会,我觉得还不如自已针对hql写个sql...
hancent 2010-01-14
  • 打赏
  • 举报
回复
3
crazylaa 2010-01-13
  • 打赏
  • 举报
回复
hib能做到的纯sql做起来应该一样的。
crazylaa 2010-01-13
  • 打赏
  • 举报
回复
直接根据需求构造sql得啦。
islandrabbit 2010-01-13
  • 打赏
  • 举报
回复
mark
TzSword 2010-01-13
  • 打赏
  • 举报
回复

二、让我们从QueryTranslatorImpl开始分析,当调用session.find('...')的时候将会调用QueryTranslatorImpl的compile方法来解析hql语句为sql语句。compile则主要是调用的doCompile方法。
// PHASE 1 : Parse the HQL into an AST.
HqlParser parser = parse( true );
// PHASE 2 : Analyze the HQL AST, and produce an SQL AST.
HqlSqlWalker w = analyze( parser, collectionRole );
sqlAst = ( Statement ) w.getAST();
generate( ( QueryNode ) sqlAst );
queryLoader = new QueryLoader( this, factory, w.getSelectClause() );
parse的主要代码:
private HqlParser parse(boolean filter)
HqlParser parser = HqlParser.getInstance( hql );
parser.statement();
AST hqlAst = parser.getAST();
return parser;
}
analyze的主要代码:
private HqlSqlWalker analyze(HqlParser parser, String collectionRole) throws QueryException, RecognitionException {
HqlSqlWalker w = new HqlSqlWalker( this, factory, parser, tokenReplacements, collectionRole );
AST hqlAst = parser.getAST();
w.statement( hqlAst );
return w;
}
generate的主要代码:
private void generate(AST sqlAst) throws QueryException, RecognitionException {
SqlGenerator gen = new SqlGenerator(factory);
gen.statement( sqlAst );
sql = gen.getSQL();
}


楼主找的还是不够细心啊。。
这个代码是上面连接的部分。。。
资源来自Google关键字HqlSqlWalker第9个。。。
道光2008 2010-01-13
  • 打赏
  • 举报
回复
http://cownew.blog.51cto.com/413531/87199
programeyonger 2010-01-13
  • 打赏
  • 举报
回复
现在 就是要解决这个问题,AST 这个就是为了解决这个问题
我现在就是不知道如何构建一个sqlAST对象。
gao512008 2010-01-13
  • 打赏
  • 举报
回复
不好办 hql好多是对象

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧