java druid 递归解析包含若干个join语句的SQLSelect,替换其中的所有 * 元素,使用getTableColumns方法获取字段arrayList信息
时间: 2024-02-03 08:13:16 浏览: 166
可以借助JavaCC等工具来解析SQL语句,然后通过递归的方式遍历整个语法树,找到所有的SELECT语句,进而替换其中的“*”元素。
以下是一个简化的示例代码:
```java
import java.util.ArrayList;
import java.util.List;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectItem;
import net.sf.jsqlparser.statement.select.SubSelect;
public class SQLParser {
public static void main(String[] args) throws JSQLParserException {
String sql = "SELECT t1.*, t2.col1, t3.col2 FROM table1 t1 "
+ "JOIN table2 t2 ON t1.id = t2.id "
+ "JOIN (SELECT id, col3 FROM table3) t3 ON t1.id = t3.id";
Statement statement = CCJSqlParserUtil.parse(sql);
if (statement instanceof Select) {
Select select = (Select) statement;
SelectBody selectBody = select.getSelectBody();
replaceAllStarColumns(selectBody);
List<TableColumn> columnList = getTableColumns(selectBody);
System.out.println(columnList);
}
}
private static void replaceAllStarColumns(SelectBody selectBody) {
if (selectBody instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) selectBody;
List<SelectItem> selectItems = plainSelect.getSelectItems();
for (int i = 0; i < selectItems.size(); i++) {
SelectItem selectItem = selectItems.get(i);
if (selectItem.toString().equals("*")) {
// Replace "*" with all columns of the table
FromItem fromItem = plainSelect.getFromItem();
if (fromItem instanceof Table) {
Table table = (Table) fromItem;
List<TableColumn> columns = getTableColumns(table);
selectItems.remove(i);
for (TableColumn column : columns) {
SelectExpressionItem expressionItem = new SelectExpressionItem();
expressionItem.setExpression(column.getColumnExpression());
selectItems.add(i++, expressionItem);
}
}
}
}
if (plainSelect.getJoins() != null) {
for (Join join : plainSelect.getJoins()) {
replaceAllStarColumns(join.getRightItem());
}
}
} else if (selectBody instanceof SubSelect) {
SubSelect subSelect = (SubSelect) selectBody;
replaceAllStarColumns(subSelect.getSelectBody());
}
}
private static List<TableColumn> getTableColumns(SelectBody selectBody) {
List<TableColumn> columnList = new ArrayList<>();
if (selectBody instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) selectBody;
List<SelectItem> selectItems = plainSelect.getSelectItems();
for (SelectItem selectItem : selectItems) {
if (selectItem instanceof SelectExpressionItem) {
SelectExpressionItem expressionItem = (SelectExpressionItem) selectItem;
Expression expression = expressionItem.getExpression();
if (expression instanceof net.sf.jsqlparser.schema.Column) {
net.sf.jsqlparser.schema.Column column = (net.sf.jsqlparser.schema.Column) expression;
columnList.add(new TableColumn(column.getTable().getName(), column.getColumnName()));
}
}
}
if (plainSelect.getJoins() != null) {
for (Join join : plainSelect.getJoins()) {
columnList.addAll(getTableColumns(join.getRightItem()));
}
}
} else if (selectBody instanceof SubSelect) {
SubSelect subSelect = (SubSelect) selectBody;
columnList.addAll(getTableColumns(subSelect.getSelectBody()));
}
return columnList;
}
private static List<TableColumn> getTableColumns(Table table) {
List<TableColumn> columnList = new ArrayList<>();
// Get columns from database or cache
// ...
return columnList;
}
}
class TableColumn {
private String tableName;
private String columnName;
// Constructors and getters
// ...
}
```
以上代码使用了JSqlParser库来解析SQL语句,并通过递归地遍历SELECT语句中的所有JOIN子句,替换其中的“*”元素,并使用getTableColumns方法获取字段arrayList信息。注意,getTableColumns方法需要根据实际情况从数据库或缓存中获取表的列信息。
阅读全文