在这里,我发现这段代码Table Finder允许您在select语句中找到Tables,我们可以将此代码修改为Attribute finder
答案 0 :(得分:0)
从理论上讲,您可以覆盖TableNameFinder的访问(Column)方法来获取列。由于它对表名的专业化,我不确定这是否足够。可能是我们在某处或某些地方没有完成处理。
另一种方法是AST节点处理。
访问者模式我是一个层次结构遍历模式,所以类似于树遍历,就像树递归一样。
答案 1 :(得分:0)
以下是一种可以从中进行修改的方法。
它应该适用于JSQLParser 1.1版
static public void columnFinder(String selectQuery) {
TablesNamesFinder finder = new TablesNamesFinder() {
private Set<String> columns;
@Override
protected void init() {
columns = new HashSet<>();
super.init();
}
@Override
public void visit(Column tableColumn) {
String colName = tableColumn.getColumnName().toLowerCase();
columns.add(colName);
}
@Override
public void visit(CaseExpression caseExpression) {
caseExpression.getElseExpression().accept(this);
caseExpression.getWhenClauses().forEach(w -> w.accept(this));
}
@Override
public void visit(WhenClause whenClause) {
whenClause.getWhenExpression().accept(this);
whenClause.getThenExpression().accept(this);
}
@Override
public void visit(ExtractExpression eexpr) {
eexpr.getExpression().accept(this);
}
@Override
public List<String> getTableList(Statement statement) {
init();
statement.accept(this);
return new ArrayList<>(columns);
}
};
Statement statement = null;
try {
statement = CCJSqlParserUtil.parse(selectQuery);
} catch (JSQLParserException e) {
e.printStackTrace();
}
finder.getTableList(statement).forEach(System.out::println);
}