2016-05-16 13 views
7

JSqlparser'ı keşfetmeye yeni başlamıştım. Anladığım kadarıyla, tablesNamesFinder sütunları ve tabloları ayıklamak için çalışıyorum ve iyi çalışıyor ama çok küçük bir problem. hükümsüz ve çok az durumlar için yazdırır vakaların çoğu içinJSqlParser - Tablo adından başlayarak

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

Bu alışkanlık baskı tablo, bu tablo tablo takma değil yazdırır. Unutmadığım bir şey var mı?

@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); 
} 

cevap

6

Öncelikle tüm kaynak kodu ziyaretlerinin

istirahat doğrudur. Akılda tutmanız gereken:

JSqlParser, yalnızca bir ayrıştırıcıdır. Eğer

select col1 from table1 

ayrıştırıcı oluşturulan nesne Sütun gibi bir şey yaparsanız onun tabloismi bilmiyor Yani. Yalnızca tam olarak yazdığınız takdirde bu durum geçerlidir:

Benzer davranış, takma adlarla da oluşur. JSqlParser , diğer ad tanımlarını genişletmiyor.

Neden? o, netleşiyor

select col1 from table1, table2 

bu tabloyu hesaplama sütun veritabanı şemasını kendisinin ihtiyacı aittir: Bu örnekteki bakarsak, doğru bir SQL hangi.

+0

ve toplam (col1 * col2) gibi toplam işlevler için, bunları İşlevler ziyaretinde yakalayabilirim, daha iyi bir yol var mı? Sorgulamak için verdiğiniz parçaların adlarıyla ilgili daha fazla bilgiye sahip olabilir miyim? Gibi: Seç (col1, col2, col3,) burada col1, col2, col3 seçili gövdedir. Viki alabilir miyim? – Waleed

+0

Emin değilim, ne demek istiyorsun? Bağlamı mı kastediyorsun? Hangi yapı içinde hangi yapı (örneğin hangi fonksiyon)? Bağlam, ayrıştırıcı ağacından türetilebilir. Ziyaretçiyi senin yaptığın gibi kullanmak iyi. – wumpz

İlgili konular