如何从含重复列名的INNER JOIN结果集中按名称获取列?
解决JDBC+SQLite中JOIN查询重复列名的取值问题
方法一:给SQL列设置别名(推荐)
直接在SELECT语句中给重复的列名设置不同别名,后续通过别名取值,这是最直观且不易出错的方式:
SELECT A.id AS a_id, B.id AS b_id FROM A INNER JOIN B ON (A.id=B.ref)
取值时直接使用别名:
String aId = rs.getString("a_id"); String bId = rs.getString("b_id");
方法二:利用ResultSetMetaData通过表名区分列
如果不想修改SQL语句,可以借助ResultSetMetaData获取列所属的表名,找到对应列的索引后通过索引取值(JDBC列索引从1开始):
ResultSet rs = ...; // 执行查询后的结果集 ResultSetMetaData meta = rs.getMetaData(); int aIdIndex = -1; int bIdIndex = -1; // 遍历所有列,匹配表名和列名 for (int i = 1; i <= meta.getColumnCount(); i++) { String tableName = meta.getTableName(i); String columnName = meta.getColumnName(i); if ("A".equals(tableName) && "id".equals(columnName)) { aIdIndex = i; } else if ("B".equals(tableName) && "id".equals(columnName)) { bIdIndex = i; } } // 通过索引获取对应值 if (aIdIndex != -1) { String aId = rs.getString(aIdIndex); } if (bIdIndex != -1) { String bId = rs.getString(bIdIndex); }
注意:JDBC的
getString(String columnLabel)方法不支持直接传入A.id这种带表名的格式,所以不能直接用rs.getString("A.id")取值。
内容的提问来源于stack exchange,提问作者bliako
相关产品推荐
相关产品推荐

