السبات: تحليل / ترجمة HQL من جزء للحصول على الاسم المستعار الطبقة أزواج، اسم الفئة

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

سؤال

ويمكن لأي شخص أن يشير لي، كيف يمكنني تحليل / تقييم 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());
}

يرجى تصحيح الإجابة إجابتك وأنا أقبل ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top