السبات: تحليل / ترجمة HQL من جزء للحصول على الاسم المستعار الطبقة أزواج، اسم الفئة
-
11-07-2019 - |
سؤال
ويمكن لأي شخص أن يشير لي، كيف يمكنني تحليل / تقييم HQL والحصول على الخريطة حيث المفتاح هو الاسم المستعار الجدول وقيمة - الاسم الكامل الطبقة المؤهلين
ومنها مثلا. لHQL
<اقتباس فقرة>وa.id SELECT من فو وINNER JOIN a.test ب
اقتباس فقرة>وأتمنى أن يكون أزواج:
لذلك، package1.Foo
ب. 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);
وهكذا يبدو أن هذا استرداد الاسم المستعار-تعيينات من الاستعلام المترجمة، ولكن أود أن نكون حذرين للغاية باستخدام هذا الحل: هو typecasts الكائنات إلى فئات فرعية لا عادة مرئية إلى السبات وموكله ويفسر AST على أساس التخمين دلالات العقد مختلفة. هذا قد لا تعمل على جميع البيانات HQL، وقد لا تعمل، أو أن يكون سلوك مختلف، على السبات-النسخة المقبلة.
نصائح أخرى
ولقد وجدت الحل الصحيح لسؤالي. وكانت مشاركتك الأصلية الصحيحة تقريبا باستثناء ذلك الجزء:
if(node.getType() == SqlTokenTypes.FROM_FRAGMENT || node.getType() == SqlTokenTypes.JOIN_FRAGMENT) {
FromElement id = (FromElement)node;
System.out.println(node+": "+id.getClassAlias()+" - "+id.getClassName());
}
يرجى تصحيح الإجابة إجابتك وأنا أقبل ذلك.