栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从SQL / HQL Java解析表和列名

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从SQL / HQL Java解析表和列名

使用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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574094.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号