최대 절전 모드 : 부분에서 구문 분석/번역 쌍 수업 별칭, 클래스 이름을 얻습니다.

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

문제

누구든지 나를 지적 할 수 있습니까, 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());
}

답변을 수정 해주세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top