有没有办法知道通过JDBC执行的SQL查询中涉及的表的名称?
例如:
SELECT r.roleId FROM User u, UserRole r where r.userId = u.userId and u.name = "Jonh Smith"
我不仅要求此查询的结果集,而是实际的表名(“用户”和“角色”)。我不关心视图名称,但如果没有办法获得视图中使用的基础表,这不是一个大问题,但这必须适用于嵌套查询。
至于为什么我需要这些信息,因为我正在创建一个平台,让其他开发人员可以在其上构建应用程序。在我的平台中,我让其他开发人员注册他们自己的查询,并将它们存储在数据库中。我不希望开发人员不得不费心实际手动注册表名和查询本身。所以当我执行查询时,我真的不知道该查询在做什么。
答案 0 :(得分:3)
JSQLParser库(LGPL V2.1)似乎能够完全满足要求:
Statement statement = CCJSqlParserUtil.parse("SELECT * FROM MY_TABLE1");
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> tableList = tablesNamesFinder.getTableList(selectStatement);
答案 1 :(得分: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
中。结果应该是所有使用的表但是......问题是,如果列未在select中公开,那么您将无法发现该表。我无法找到解决方法。