JDBC 结果集获取具有表别名的列
想象一下,我有一个像这样的查询
SELECT * from table1 a, table2 b where (WHATEVER)
也许两个表具有相同的列名。所以我虽然通过访问数据会很好
resultSet.getString("a.columnName");
resultSet.getString("b.columnName");
但这适得其反,我什么也得不到。我阅读了API,但他们并没有真正谈论这种情况。此类功能是否依赖于供应商?
想象一下,我有一个像这样的查询
SELECT * from table1 a, table2 b where (WHATEVER)
也许两个表具有相同的列名。所以我虽然通过访问数据会很好
resultSet.getString("a.columnName");
resultSet.getString("b.columnName");
但这适得其反,我什么也得不到。我阅读了API,但他们并没有真正谈论这种情况。此类功能是否依赖于供应商?
JDBC 将简单地根据查询中指定的内容来命名列 - 它不知道表名等。
您有两种选择:
选项 1:在查询中以不同的方式命名列,即
SELECT
a.columnName as columnNameA,
b.columnName as columnNameB,
...
from table1 a, table2 b where (WHATEVER)
然后在您的Java代码中引用列别名:
resultSet.getString("columnNameA");
resultSet.getString("columnNameB");
选项 2:请参阅调用 JDBC API 中的列位置:
resultSet.getString(1);
resultSet.getString(2);
请注意,JDBC API使用基于一的索引 - 即它们从(而不是从Java索引)计数,因此用于第一列,第二列等1
0
1
2
我建议使用选项 1,因为引用命名列更安全:有人可能会更改查询中列的顺序,这会静默地破坏您的代码(您将访问错误的列,但不知道),但是如果他们更改列名称,您至少会在运行时收到“没有此类列”异常。
ResultSetMetadata.getColumnLabel() 是你需要的
(编辑)示例示例,如 bharal 在注释中所述
SELECT * from table1 a, table2 b where (WHATEVER)
ResultSetMetaData rsmd = rset.getMetaData();
rsmd.getColumnLabel(1);