休眠:分析/翻译非常从一部分,以获得对类别、类名称
-
11-07-2019 - |
题
任何人都可以我指出,我怎么可以分析/评估非常并得到地图,关键是表的别名和价值的充分合格的类名称。
E.g。对于非常
选择一种。id从Foo一个内加入的一个。测试b
我希望有对:
一、package1.Foo
b.package2.TestClassName
这是比较容易做到的结果设定
HQLQueryPlan hqlPlan = ((SessionFactoryImpl)sf).getQueryPlanCache().getHQLQueryPlan( getQueryString(), false, ((SessionImpl)session).getEnabledFilters() ); String[] aliases = hqlPlan.getReturnMetadata().getReturnAliases(); Type[] types = hqlPlan.getReturnMetadata().getReturnTypes();
看看 详细信息在这里.
解决方案
几乎没有一个良好的方式这样做,但它似乎可以获得AST通过一些内部接口和历这样的:
QueryTranslator[] translators = hqlPlan.getTranslators();
AST ast = (AST)((QueryTranslatorImpl)translators[0]).getSqlAST();
new NodeTraverser(new NodeTraverser.VisitationStrategy() {
public void visit(AST node) {
if(node.getType() == SqlTokenTypes.FROM_FRAGMENT || node.getType() == SqlTokenTypes.JOIN_FRAGMENT) {
FromElement id = (FromElement)node;
System.out.println(node+": "+id.getClassAlias()+" - "+id.getClassName());
}
}
}).traverseDepthFirst(ast);
因此,这似乎检索的别名映自编制查询,但我要非常小心使用这种解决方案:它类型转化对象的子类,通常不可见的一种休眠户并解释AST基于猜测的语义的不同的节点。这可能不是所有的非常-声明,并且可能不工作,或者具有不同的行为,在今后的休眠版本。
其他提示
我发现我的问题的解决方案。你原来的职位几乎是正确的,只是部分:
if(node.getType() == SqlTokenTypes.FROM_FRAGMENT || node.getType() == SqlTokenTypes.JOIN_FRAGMENT) {
FromElement id = (FromElement)node;
System.out.println(node+": "+id.getClassAlias()+" - "+id.getClassName());
}
请更正你的答案的答案,我接受了。
不隶属于 StackOverflow