java解析表字段_从SQL / HQL Java解析表和列名

小编典典

您可以使用 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);

必须记住,JSqlParser只是一个解析器。因此,如果不像(table.column)中那样指定列表名称,就不可能获得列表名称。为了实现此目的,数据库模式必须可用。如果您查看以下内容,这将变得清楚:

select a from table1, table2

这是有效的SQL。

2020-11-01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值