JDBC 结果集获取具有表别名的列

2022-08-31 19:54:36

想象一下,我有一个像这样的查询

SELECT * from table1 a, table2 b where (WHATEVER)

也许两个表具有相同的列名。所以我虽然通过访问数据会很好

resultSet.getString("a.columnName");
resultSet.getString("b.columnName");

但这适得其反,我什么也得不到。我阅读了API,但他们并没有真正谈论这种情况。此类功能是否依赖于供应商?


答案 1

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索引)计数,因此用于第一列,第二列等1012


我建议使用选项 1,因为引用命名列更安全:有人可能会更改查询中列的顺序,这会静默地破坏您的代码(您将访问错误的列,但不知道),但是如果他们更改列名称,您至少会在运行时收到“没有此类列”异常。


答案 2

ResultSetMetadata.getColumnLabel() 是你需要的

(编辑)示例示例,如 bharal 在注释中所述

SELECT * from table1 a, table2 b where (WHATEVER)

ResultSetMetaData rsmd = rset.getMetaData();
rsmd.getColumnLabel(1);

推荐