Има няколко начина да постигнете това с помощта на JSqlParser (https://github.com/JSQLParser/JSqlParser):
-
Можете да сводните TableNamesFinder за да преминете и всички колони. Както можете да видите в списъка с резултати, TableNamesFinder не преминава през всички срещания на Колони , защото не е необходимо за това. Така че и тук трябва да завършите реализацията на обхода, което не направих.
-
Можете да използвате JSqlParser AST – функция за възел за да получите всички колони. За специфични продукции JSqlParser произвежда възли за дърво за синтактичен анализ. Колона е един от тях.
За да завършите внедряването, трябва да съберете всички колони и да направите този списък различен (случай, таблица и т.н.)
String sql = "SELECT * FROM ( ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL1.SHORT_NAME AS shortName FROM ROLE_TBL TBL WHERE ( TBL.TYPE = 'CORE' OR TBL1.SHORT_NAME = 'TNG' AND TBL.IS_DELETED <> 1 ) ) MINUS ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL3.SHORT_NAME AS shortName,TBL3.NAME AS tenantName FROM ROLE_TBL TBL INNER JOIN TYPE_ROLE_TBL TBL1 ON TBL.ID=TBL1.ROLE_FK LEFT OUTER JOIN TNT_TBL TBL3 ON TBL3.ID = TBL.TENANT_FK LEFT OUTER JOIN USER_TBL TBL4 ON TBL4.ID = TBL1.USER_FK WHERE ( TBL4.ID =771100 AND TBL.IS_DELETED <> 1 ) ) ) ORDER BY name ASC";
System.out.println("using TableNamesFinder to get column names");
Statement statement = CCJSqlParserUtil.parse(sql);
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
@Override
public void visit(Column tableColumn) {
System.out.println(tableColumn);
}
};
tablesNamesFinder.getTableList(selectStatement);
System.out.println("-------------------------------------------");
System.out.println("using ast nodes to get column names");
SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);
node.jjtAccept(new CCJSqlParserDefaultVisitor() {
@Override
public Object visit(SimpleNode node, Object data) {
if (node.getId() == CCJSqlParserTreeConstants.JJTCOLUMN) {
System.out.println(node.jjtGetValue());
return super.visit(node, data);
} else {
return super.visit(node, data);
}
}
}, null);
Трябва да се има предвид, че JSqlParser е само анализатор. Следователно не е възможно да се получи името на таблицата с колони, без да е посочено като в (table.column). За да направите това правилно, схемата на базата данни трябва да е налична. Това става ясно, ако погледнете:
select a from table1, table2
което е валиден SQL.