8

我刚刚开始探索 JSqlparser。根据我的理解,我已经修改了 TablesNamesFinder 以提取列和表,它的工作正常但一个很小的问题。

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

这不会打印表格,在大多数情况下它会打印 null 并且在极少数情况下它会打印表格的别名但不打印表格。有什么我忘记了吗?

其余访问

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

1 回答 1

7

首先你的源代码是正确的。你必须记住:

JSqlParser只是一个解析器。所以如果你做类似的事情

select col1 from table1

解析器生成的对象Column不知道它的表名。仅当您编写完全限定时才会出现这种情况:

select table1.col1 from table1

别名也会发生类似的行为。JSqlParser不扩展别名定义。

为什么?如果你看这个例子,这是一个正确的 SQL:

select col1 from table1, table2

很明显,计算列所属的表需要数据库模式本身。

于 2016-05-23T06:25:47.330 回答