Hibernate:解析/翻訳HQLからの部品を組クラスのエイリアス、クラス名

StackOverflow https://stackoverflow.com/questions/324105

質問

誰でもできるのでも、どんな解析-評HQL、地図がキーテーブルエイリアスおよび価値の完全修飾クラス名です。

E.g.のためのHQL

選択。利用して次のように書き換えられFoo内参加。試験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();

詳細はこちら.

役に立ちましたか?

解決

それを行うのは非常に良い方法ですが、いくつかの内部インターフェイスを介して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);

したがって、これはコンパイルされたクエリからエイリアスマッピングを取得するようですが、このソリューションの使用には非常に注意します:通常は休止状態クライアントに表示されないサブクラスにオブジェクトを型キャストし、さまざまなノード。これは、すべてのHQLステートメントで機能するわけではなく、将来のhibernate-versionでは機能しないか、異なる動作をする可能性があります。

他のヒント

かに応じた適切なソリューションが私の質問です。オリジナルの募集でしたがほぼ正しいことを除いて一部は:

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