2013-05-27 6 views
8

JSQLPARSER를 처음 사용하고 있습니다. 나는 동적으로 오는 일부 SQL 파일을 가지고 있는데, 나는 그 SQL로부터 테이블과 컬럼 이름을 읽을 필요가있다. 인터넷 검색을 많이 한 후 JSQLPARSER를 사용해 보았습니다. 파일에서 열 이름을 읽으려고하는데 표현식으로 인해 열 이름을 읽을 수 없으므로 어느 곳에서 잘못 되었든 제 코드를 수정할 수 있습니까?JSQLPARSE를 사용하여 SQl에서 테이블 및 열 이름을 검색하는 방법

public static void main(String[] args) throws JSQLParserException 
    { 
     // TODO Auto-generated method stub 
     String statement="SELECT LOCATION_D.REGION_NAME, LOCATION_D.AREA_NAME, COUNT(DISTINCT INCIDENT_FACT.TICKET_ID) FROM LOCATION_D, INCIDENT_FACT WHERE (LOCATION_D.LOCATION_SK=INCIDENT_FACT.LOCATION_SK) GROUP BY LOCATION_D.REGION_NAME, LOCATION_D.AREA_NAME"; 
     CCJSqlParserManager parserManager = new CCJSqlParserManager(); 
     Select select=(Select) parserManager.parse(new StringReader(statement)); 

     PlainSelect plain=(PlainSelect)select.getSelectBody();  
     List selectitems=plain.getSelectItems(); 
     System.out.println(selectitems.size()); 
     for(int i=0;i<selectitems.size();i++) 
     { 
      Expression expression=((SelectExpressionItem) selectitems.get(i)).getExpression(); 
      System.out.println("Expression:-"+expression); 
      Column col=(Column)expression; 
      System.out.println(col.getTable()+","+col.getColumnName());  
     } 
    } 

답변

1
public class TablesNamesFinder 
    implements SelectVisitor, FromItemVisitor, ExpressionVisitor, 
    ItemsListVisitor 
{ 
    private List tables; 

    public List getTableList(Select select) { 
     tables = new ArrayList(); 
     select.getSelectBody().accept(this); 
     return tables; 
    } 

    public void visit(PlainSelect plainSelect) { 
     plainSelect.getFromItem().accept(this); 

     if (plainSelect.getJoins() != null) { 
      for (Iterator joinsIt = plainSelect.getJoins().iterator(); joinsIt.hasNext();) { 
       Join join = (Join) joinsIt.next(); 
       join.getRightItem().accept(this); 
      } 
     } 
     if (plainSelect.getWhere() != null) 
      plainSelect.getWhere().accept(this); 

    } 

    public void visit(Union union) { 
     for (Iterator iter = union.getPlainSelects().iterator(); iter.hasNext();) { 
      PlainSelect plainSelect = (PlainSelect) iter.next(); 
      visit(plainSelect); 
     } 
    } 

    public void visit(Table tableName) { 
     String tableWholeName = tableName.getWholeTableName(); 
     tables.add(tableWholeName); 
    } 

    public void visit(SubSelect subSelect) { 
     subSelect.getSelectBody().accept(this); 
    } 
//and other visit implement .... 

} 
2

당신은 당신의 선택에 요청 세 번째 값은 열하지만 함수가 아닙니다 : 나는 ClassCastException이에게 코드를 얻고있다. 따라서 JSqlParser는 사용자가 Column으로 변환 할 수없는 표현식을 제공합니다.

1

wumpz가 문제를 지적 했으므로 목록의 함수를 열에 캐스팅 할 수 없습니다. 내 요구 사항이 동일하며이 코드가 문제를 해결하는 데 도움이됩니다. 희망이 도움이됩니다. 표현식은 열 또는 함수이고 그에 따라 사용할 수있는 경우 확인할 수 있습니다.

 for(int i=0;i<selectitems.size();i++) 
     { 
      Expression expression=((SelectExpressionItem) selectitems.get(i)).getExpression(); 
      System.out.println("Expression:-"+expression); 
      if(expression instanceof Column) 
      { 
       Column col=(Column)expression; 
       System.out.println(col.getTable()+","+col.getColumnName());  

      } 
      else if (expression instanceof Function) 
      { 
       Function function = (Function) expression; 
       System.out.println(function.getAttribute()+","+function.getName()+""+function.getParameters());  

      } 

     }