任何人都可以我指出,我怎么可以分析/评估非常并得到地图,关键是表的别名和价值的充分合格的类名称。

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());
}

请更正你的答案的答案,我接受了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top