최대 절전 모드 : 부분에서 구문 분석/번역 쌍 수업 별칭, 클래스 이름을 얻습니다.
-
11-07-2019 - |
문제
누구든지 나를 지적 할 수 있습니까, HQL을 구문 분석/평가하고 키가 테이블 별명 및 가치 인 곳에서지도를받을 수있는 방법 - 전체 자격을 갖춘 클래스 이름.
예를 들어 HQL
Foo에서 A.ID를 선택하십시오. 내부 조인 A.test b
나는 쌍을 갖고 싶다 :
A, 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);
따라서 이것은 컴파일 된 쿼리에서 별명 매핑을 검색하는 것처럼 보이지만이 솔루션을 사용하여 매우주의를 기울일 것입니다. 일반적으로 최대 절전 모드에 보이지 않는 하위 클래스에 대한 타입 캐스트를 통해 다른 노드의 의미를 추측하는 데 기반한 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());
}
답변을 수정 해주세요.
제휴하지 않습니다 StackOverflow