JDBC:获取SQL查询中涉及的表名

问题描述 投票:5回答:2

有没有办法知道通过JDBC执行的SQL查询中涉及的表的名称?

例如:

SELECT r.roleId FROM User u, UserRole r where r.userId = u.userId and u.name = "Jonh Smith"

我不仅需要此查询的结果集,还需要实际的表名(“用户”和“角色”)。我不在乎视图名称,但是如果没有办法在视图中使用基础表,这不是一个大问题,但这必须与嵌套查询一起使用。

关于我为什么需要此信息的原因是,因为我正在构建一个平台,允许其他开发人员在此平台上构建应用程序。在我的平台上,我让其他开发人员注册他们自己的查询并将它们存储在数据库中。我不希望开发人员不得不手动手动注册表名称以及查询本身。因此,在执行查询时,我并不真正知道该查询在做什么。

java sql jdbc
2个回答
2
投票

我还没有找到如何正确执行所需功能的方法,但是无论如何我都将发表此评论,因为评论太久了。我找到的最接近的东西是ResultSetMetaData

This is a tutorial on how to get it.但是该教程没有显示如何获取表名。进行该操作的方法称为getTableName

/**
 * Gets the designated column's table name. 
 *
 * @param column the first column is 1, the second is 2, ...
 * @return table name or "" if not applicable
 * @exception SQLException if a database access error occurs
 */
String getTableName(int column) throws SQLException;

我认为您必须遍历所有列并将表名放在Set中。结果应该是所有使用的表,但是...问题是,如果选择中未显示该列,那么您将无法发现该表。我还没有找到解决这个问题的方法。


2
投票

JSQLParser库(LGPL V2.1)似乎能够完全满足要求:

Extract table names from SQL

Statement statement = CCJSqlParserUtil.parse("SELECT * FROM MY_TABLE1");
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> tableList = tablesNamesFinder.getTableList(selectStatement);
© www.soinside.com 2019 - 2024. All rights reserved.