2016-05-16 56 views
7

我剛開始探索JSqlparser。根據我的理解,我修改了TablesNamesFinder來提取列和表,它的工作正常,但一個非常小的問題。JSqlParser - 從列中獲取表名

@Override 
public void visit(Column col) { 
    Column c = col; 
    String cname = c.getFullyQualifiedName(); 
    Table t = c.getTable(); 
    System.out.println(t.getName()); 
} 

這不會打印表,對於大多數的情況下,打印空和極少數的情況下,打印該表的別名,但不表。有什麼我忘記了嗎?

的訪問所有的源代碼的

@Override 
public void visit(SelectExpressionItem exp){ 
    exp.getExpression().accept(this); 
}   

@Override 
public void visit(Table tableName) { 
    // System.out.println(tableName.getFullyQualifiedName()); 
} 

@Override 
public void visit(Select select) { 
    select.getSelectBody().accept(this); 
} 

回答

6

第一的休息是正確的。你必須記住:

JSqlParser是只有一個解析器。所以,如果你這樣做

select col1 from table1 

解析器生成的對象不知道它的表名。只有在您編寫完全限定的情況下才會出現這種情況:

select table1.col1 from table1 

類似的行爲發生在別名上。 JSqlParser 不擴展別名定義。

爲什麼?如果你看看下面這個例子,這是正確的SQL:

select col1 from table1, table2 

它變得清晰,在計算表中的列屬於所需要的數據庫模式本身。

+0

和sum(col1 * col2)這樣的聚合函數,我可以在函數visit中捕獲這些,有沒有更好的方法?我可以有更多關於你給予查詢的部分名稱的信息。喜歡:選擇(col1,col2,col3,)這裏col1,col2,col3是選擇正文。我可以擁有wiki嗎? – Waleed

+0

我不確定,你的意思是?你的意思是上下文嗎?像哪個結構中的哪個列(例如哪個函數)?上下文可以從分析樹中導出。使用像你這樣的訪問者可以。 – wumpz