簡體   English   中英

JDBC:獲取 SQL 查詢中涉及的表名

[英]JDBC: Get table names involved in a SQL query

有沒有辦法知道通過 JDBC 執行的 SQL 查詢中涉及的表的名稱?

例如:

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

我不僅想要這個查詢的結果集,還想要實際的表名(“用戶”和“角色”)。 我不關心視圖名稱,但如果無法獲取視圖中使用的基礎表,這不是大問題,但這必須與嵌套查詢一起使用。

至於為什么我需要這些信息,是因為我正在制作一個平台,讓其他開發人員在其上構建應用程序。 在我的平台上,我讓其他開發人員注冊他們自己的查詢並將它們存儲在數據庫中。 我不希望開發人員不得不為實際手動注冊表名以及查詢本身而煩惱。 所以在我執行查詢時,我真的不知道該查詢在做什么。

我還沒有找到如何做你需要做的事情,但無論如何我都會發布這個,因為評論太長了。 我發現的最接近的是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 結果應該是所有使用的表,但是...問題是,如果列未在選擇中公開,那么您將無法發現該表。 我一直無法找到解決此問題的方法。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM