私もJavaは初めてなので、あなたのことを聞いています;)。でも、答えを出すために最善を尽くす前に、よろしければ一言言いたいと思います。あなたの質問は、Java とデータベース/SQL に関連しています。DBテーブルとクエリから得られるものについていくつか説明する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 がコメントで行ったように、明示的な結合構文の使用を検討することもお勧めします。
私は他の DB (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