在这里我找到了这个代码表查找器,它允许您在选择语句中查找表我们可以修改此代码为属性查找器吗
问问题
252 次
2 回答
1
这是您可以开始和修改它的一种方法。
它应该适用于 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);
}
于 2017-08-27T20:07:02.090 回答
0
从理论上讲,您可以覆盖 TableNameFinder 的访问 (Column ) 方法来获取列。我不确定这是否足够,因为它专门用于表名。可能是我们跳过某处的处理或未完成列的处理。
另一种方法是 AST 节点处理。
访问者模式是一个层次遍历模式,因此类似于树遍历,就像树递归一样。
于 2017-08-27T14:04:31.677 回答