Hibernate:Parse/Übersetzen HQL VON Teil zu bekommen Paare-Klasse alias, Klasse name
-
11-07-2019 - |
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.
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.