6

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

例如:

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

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

至于我为什么需要这些信息,是因为我正在制作一个平台,让其他开发人员可以在它之上构建应用程序。在我的平台中,我让其他开发人员注册他们自己的查询并将它们存储在数据库中。我不希望开发人员不得不为实际手动注册表名以及查询本身而烦恼。所以在我执行查询时,我真的不知道该查询在做什么。

4

2 回答 2

3

我还没有找到如何做你需要的东西,但无论如何我都会发布这个,因为它太长了,无法发表评论。我发现最接近的是ResultSetMetaData

这是一个关于如何获取它的教程。 但是该教程没有显示如何获取表名。执行此操作的方法称为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. 结果应该是所有使用的表,但是......问题是,如果该列未在选择中公开,那么您将无法发现该表。我一直无法找到解决这个问题的方法。

于 2013-05-17T19:08:44.070 回答
3

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

从 SQL 中提取表名

Statement statement = CCJSqlParserUtil.parse("SELECT * FROM MY_TABLE1");
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> tableList = tablesNamesFinder.getTableList(selectStatement);
于 2020-05-04T20:06:21.027 回答