Lis*_*isa 2 java oracle parsing jsqlparser
我正在寻找 Java 中的开源 API 来解析 SQL/HQL 查询,以便它为我提供其中使用的列名和表名。我尝试使用 JSQLParser,它为我提供了查询中使用的表名。但我没有看到支持获取查询中使用的列名。有没有其他 API 可以帮助我解决这个问题?我知道通用 SQL 解析器,但它似乎是付费的。
这是使用 JSQLParser 的代码片段,它为我提供了查询中的表名:
Statement statement;
try
{
statement = CCJSqlParserUtil.parse( " 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" );
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> tableList = tablesNamesFinder.getTableList( selectStatement );
System.out.println( tableList.size() );
for( String s : tableList )
System.out.println( s );
}
catch( JSQLParserException e )
{
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
预先感谢您在这方面的任何帮助。
使用 JSqlParser ( https://github.com/JSQLParser/JSqlParser )有多种方法可以实现这一点:
您也可以使用皮条客TableNamesFinder来遍历所有列。正如您在结果列表中看到的,TableNamesFinder不会遍历所有出现的Columns,因为它不是必需的。所以这里也必须完成遍历实现,我没有。
您可以使用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);
Run Code Online (Sandbox Code Playgroud)
必须记住,JSqlParser 只是一个解析器。因此,如果没有像 (table.column) 那样指定,就不可能获得列表名。为了做到这一点,数据库模式必须可用。如果您查看以下内容,这将变得很清楚:
select a from table1, table2
Run Code Online (Sandbox Code Playgroud)
这是一个有效的 SQL。
归档时间: |
|
查看次数: |
2831 次 |
最近记录: |