Впадать в спящий режим:Проанализируйте / Переведите HQL ИЗ части, чтобы получить псевдоним класса pairs, имя класса
-
11-07-2019 - |
Вопрос
Кто-нибудь может указать мне, как я могу проанализировать / оценить 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());
}
Пожалуйста, исправьте свой ответ, и я принимаю его.