当前位置: 首页 > 面试题库 >

从SQL / HQL Java解析表和列名

朱宇航
2023-03-14
问题内容

我正在寻找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();
    }

在此先感谢您的任何帮助。


问题答案:

使用JSqlParser(https://github.com/JSQLParser/JSqlParser)有多种方法可以实现此目的:

  1. 您可以使用 TableNamesFinder 来遍历所有列。正如您在结果列表中看到的那样, TableNamesFinder 不会遍历 Columns的 所有出现,因为它不是必需的。因此,这里也必须完成遍历实现,而我没有。

  2. 您可以使用 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。



 类似资料:
  • 问题内容: 我有一个这样的查询脚本: 从dbo.View1中选择View1.OrderDate,View1.Email,SUM(View1.TotalPayments)WHERE(View1.OrderStatus =’Completed’)GROUP BY View1.OrderDate,View1.Email HAVING(SUM(View1.TotalPayments)> 75); 有什么方

  • 问题内容: 我正在寻找一个SQL库,该库将解析SQL语句并返回该SQL语句的某种对象表示形式。我的主要目标实际上是能够解析SQL语句并检索SQL语句中存在的表名列表(包括子查询,联接和联合)。 我正在寻找具有商业友好许可证(例如Apache许可证)的免费库。我正在寻找一个库,而不是一个SQL语法。我不想建立自己的解析器。 到目前为止,我能找到的最好的就是JSQLParser,他们给出的示例实际上与

  • 本文向大家介绍python生成器表达式和列表解析,包括了python生成器表达式和列表解析的使用技巧和注意事项,需要的朋友参考一下 绝大多数情况下,遍历一个集合都是为了对元素应用某个动作或是进行筛选。如果看过本文的第二部分,你应该还记得有内建函数map和filter提供了这些功能,但Python仍然为这些操作提供了语言级的支持。 如你所见,生成器表达式和列表解析(注:这里的翻译有很多种,比如列表展

  • 问题内容: 我想获取一个HTML表并对其进行解析以获得字典列表。每个列表元素将是一个与表中的一行相对应的字典。 例如,如果我有一个包含三列(用标题标签标记),“事件”,“开始日期”和“结束日期”的HTML表,并且该表有5个条目,我想将该表解析为返回长度为5的列表,其中每个元素都是带有键“事件”,“开始日期”和“结束日期”的字典。 谢谢您的帮助! 问题答案: 您应该使用一些HTML解析库,例如: 版

  • DatabaseTypedSQLParserFacade SPI 名称 详细说明 DatabaseTypedSQLParserFacade 配置用于SQL解析的词法分析器和语法分析器入口 Implementation Class Description MySQLParserFacade 基于 MySQL 的 SQL 解析器入口 PostgreSQLParserFacade 基于 PostgreS

  • 本文向大家介绍SQL Server行转列的方法解析,包括了SQL Server行转列的方法解析的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!