我也是 Java 新手,所以我听到了;)。但在我尽力给你答案之前,如果你不介意的话,我想说一句。您的问题与 Java 和数据库/SQL 有关。您提供了一些 SQL,它解释了有关您的数据库表的一些事情以及您可以从查询中得到什么。但是您的主要问题是 Java 并且您没有提供任何 Java 代码,以便我们可以更好地了解您要完成的工作以及您遇到问题的具体位置。话虽如此,我希望以下内容能让您了解您可以做什么:
首先,ResultSet
您的查询中包含两name
列。它们不会被覆盖。这是一个例子:
String sql = "select * from leaves, type_applications, type_leaves " +
"where leaves.type_leave = type_leaves.id and " +
"leaves.type_application = type_applications.id";
ResultSet rs = stmt.executeQuery(sql);
DBTablePrinter.printResultSet(rs);
这将打印如下内容:
Printing 1 rows from table(s) LEAVES, TYPE_APPLICATIONS, TYPE_LEAVES
+----+------------------------+------------+------------------+----+--------+
| ID | SOMETHING_ABOUT_LEAVES | ID | NAME | ID | NAME |
+----+------------------------+----+--------------------+----+--------------+
| 1 | green | 1 | application type 1 | 1 | leave type 1 |
+----+------------------------+----+--------------------+----+--------------+
可以看出,两name
列都在那里。(我使用了我编写的 DBTablePrinter 实用程序类。如果您有兴趣,可以在这里找到它)。正如 Strawberry 在评论中所做的那样,我还建议考虑使用显式连接语法。
我正在使用其他数据库(H2),所以我不确定这是否适用于 MySQL,但您可以尝试(它对我有用):
// After executing the query
rs.next();
System.out.println(rs.getString("TYPE_LEAVES.NAME"));
System.out.println(rs.getString("TYPE_APPLICATIONS.NAME"));
// Prints:
// leave type 1
// application type 1
如果这不起作用,或者您确实需要为列名添加前缀并使用这些新名称访问它们,那么我能想到的就是这样的:
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
// A HashMap with column names as key
Map<String, List<String>> columns = new HashMap<>(columnCount);
// Loop through columns, rename as you wish
for (int i = 1; i <= columnCount; i++) {
if (rsmd.getColumnLabel(i).equals("NAME")) {
if (rsmd.getTableName(i).equals("TYPE_LEAVES")) {
columns.put("L_NAME", new ArrayList<>());
} else {
columns.put("APP_NAME", new ArrayList<>());
}
} else {
columns.put(rsmd.getColumnLabel(i), new ArrayList<>());
}
}
// Iterate over ResultSet rows, add values to columns
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
String columnName = rsmd.getColumnLabel(i);
String tableName = rsmd.getTableName(i);
if (columnName.equals("NAME")) {
if (tableName.equals("TYPE_LEAVES")) {
columns.get("L_NAME").add(rs.getString(i));
} else {
columns.get("APP_NAME").add(rs.getString(i));
}
} else {
columns.get(columnName).add(rs.getString(i))
}
}
}
// Print, for example, first row values for L_NAME and APP_NAME columns
System.out.println(columns.get("L_NAME").get(0));
System.out.println(columns.get("APP_NAME").get(0));
// Prints:
// leave type 1
// application type 1