3

HQL を解析/評価し、キーがテーブル エイリアスで値が完全修飾クラス名であるマップを取得する方法を教えてください。

たとえば、HQL の場合

SELECT a.id from Foo a INNER JOIN a.test b

ペアが欲しい:

a、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();

詳細はこちらをご覧ください。

4

2 に答える 2

4

それを行うにはほとんど良い方法ではありませんが、いくつかの内部インターフェースを介して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 を解釈します。 . これは、すべての HQL ステートメントで機能するとは限らず、将来の hibernate バージョンでは機能しないか、動作が異なる可能性があります。

于 2008-12-19T15:04:20.573 に答える
0

私は自分の質問に対する正しい解決策を見つけました。元の投稿は、その部分を除いてほぼ正しかった:

if(node.getType() == SqlTokenTypes.FROM_FRAGMENT || node.getType() == SqlTokenTypes.JOIN_FRAGMENT) {
 FromElement id = (FromElement)node;
 System.out.println(node+": "+id.getClassAlias()+" - "+id.getClassName());
}

あなたの答えを修正してください。私はそれを受け入れます。

于 2008-12-20T08:48:21.423 に答える