Frage

Kann jemand zeigen Sie mir, wie kann ich analysieren/bewerten HQL und Holen Sie sich anzeigen, wo der Schlüssel ist Tabellen-alias-und Wert - voll qualifizierten Klassennamen.

E. g.für HQL

WÄHLEN Sie ein.id von Foo ein INNER JOIN ein.test b

Ich möchte Paare:

a package1.Foo

b.package2.TestClassName

Es ist relativ einfach zu tun, für das Ergebnis festlegen

HQLQueryPlan hqlPlan = ((SessionFactoryImpl)sf).getQueryPlanCache().getHQLQueryPlan( getQueryString(), false, ((SessionImpl)session).getEnabledFilters() );
String[] aliases = hqlPlan.getReturnMetadata().getReturnAliases();
Type[] types = hqlPlan.getReturnMetadata().getReturnTypes();

Finden details hier.

War es hilfreich?

Lösung

Kaum eine gute Weg, es zu tun, aber es scheint, Sie können erhalten die AST durch einige interne Schnittstellen und durchqueren diese:

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

So scheint dies zum abrufen der alias-Zuweisungen aus der kompilierte Abfrage, aber ich wäre sehr vorsichtig mit dieser Lösung:es Typumwandlungen von Objekten an Unterklassen in der Regel nicht sichtbar, um ein hibernate-client und interpretiert den AST basierend auf erraten die Semantik der verschiedenen Knoten.Dies funktioniert möglicherweise nicht auf alle HQL-Anweisungen, und vielleicht nicht arbeiten, oder haben unterschiedliches Verhalten, auf eine Zukunft, hibernate-version.

Andere Tipps

Ich habe eine gute Lösung gefunden für meine Frage.Ihren ursprünglichen Beitrag war fast richtig, außer dass ein Teil:

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

Bitte korrigieren Sie Ihre Antwort, Antwort, und ich akzeptiere es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top