Впадать в спящий режим:Проанализируйте / Переведите HQL ИЗ части, чтобы получить псевдоним класса pairs, имя класса

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

Вопрос

Кто-нибудь может указать мне, как я могу проанализировать / оценить HQL и получить map, где ключ - это псевдоним таблицы, а значение - полное имя класса.

Например.для HQL

ВЫБЕРИТЕ a.id из Foo a ВНУТРЕННЕЕ СОЕДИНЕНИЕ a.тест b

Я хочу иметь пары:

a, упаковка 1.Foo

b.package2.Имя_ТестоВого класса

Это относительно легко сделать для результирующего набора

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

Таким образом, это, кажется, извлекает сопоставления псевдонимов из скомпилированного запроса, но я был бы очень осторожен, используя это решение:он присваивает типам объектов подклассы, которые обычно не видны клиенту гибернации, и интерпретирует AST на основе угадывания семантики различных узлов.Это может работать не со всеми HQL-инструкциями и может не работать или иметь другое поведение в будущей версии hibernate.

Другие советы

Я нашел правильное решение для своего вопроса.Ваш первоначальный пост был почти правильным, за исключением этой части:

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