0

在这里我找到了这个代码表查找器,它允许您在选择语句中查找表我们可以修改此代码为属性查找器吗

4

2 回答 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 回答