我可以将JsqlParser中的表Finder类修改为列查找器类吗?

时间:2017-08-26 15:29:51

标签: java sql jsqlparser

在这里,我发现这段代码Table Finder允许您在select语句中找到Tables,我们可以将此代码修改为Attribute finder

2 个答案:

答案 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);
}