2013-05-27 9 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

あなたの選択で要求する3番目の値は、列が、関数ではありません:私は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());  

      } 

     } 
関連する問題