JDBC ResultSet获取具有表别名的列

Fra*_*fka 46 java sql oracle jdbc resultset

想象一下,我有一个类似的查询

SELECT * from table1 a, table2 b where (WHATEVER)
Run Code Online (Sandbox Code Playgroud)

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

resultSet.getString("a.columnName");
resultSet.getString("b.columnName");
Run Code Online (Sandbox Code Playgroud)

但这对我不利,我一无所获.我读了API,但他们并没有真正谈论这个案例.这样的功能供应商是否依赖?

Boh*_*ian 45

JDBC将根据查询中指定的内容命名列 - 它不知道表名等.

您有两种选择:

选项1:在查询中以不同方式命名列,即

SELECT
    a.columnName as columnNameA,
    b.columnName as columnNameB,
    ...
from table1 a, table2 b where (WHATEVER)
Run Code Online (Sandbox Code Playgroud)

然后在你的java代码中引用列别名:

resultSet.getString("columnNameA");
resultSet.getString("columnNameB");
Run Code Online (Sandbox Code Playgroud)


选项2:请参阅对JDBC API的调用中的列位置:

resultSet.getString(1);
resultSet.getString(2);
Run Code Online (Sandbox Code Playgroud)

请注意,JDBC API使用基于一的索引 - 即它们从1(不是来自0类似的java索引)开始计数,因此1用于第一列,2第二列等等


我建议选项1,因为引用命名列更安全:有人可能会更改查询中列的顺序,它会默默地破坏您的代码(您将访问错误的列但不知道),但如果他们更改列名称,您至少会在运行时获得"无此列"异常.


Mat*_*een 13

ResultSetMetadata.getColumnLabel()是您所需要的

(编辑)示例,如bharal在评论中所述

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

ResultSetMetaData rsmd = rset.getMetaData();
rsmd.getColumnLabel(1);
Run Code Online (Sandbox Code Playgroud)

  • 为什么以及如何以及如何进行此工作的示例? (3认同)

Dav*_*eto 8

使用列别名,如:

SELECT A.ID 'A_ID', B.ID 'B_ID' FROM TABLE1 AS A, TABLE2 AS B...
Run Code Online (Sandbox Code Playgroud)

并指定要检索的所有列(这是一个很好的做法).


Hal*_*vic 5

如果您使用MySQL只需添加

&useOldAliasMetadataBehavior=true
Run Code Online (Sandbox Code Playgroud)

你的connectionString.

之后你可以使用这个小助手:

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class ResultSetHelper {

    private final Map<String, Integer> columnMap;

    public ResultSetHelper(ResultSet rs) throws SQLException {
        this.columnMap = new HashMap<>();
        ResultSetMetaData md = rs.getMetaData();
        int columnCount = md.getColumnCount();
        for (int index = 1; index <= columnCount; index++) {
            String columnName = md.getColumnLabel(index);
            if (!columnMap.containsKey(columnName)) {
                columnMap.put(columnName, index);
            }

            String tableAlias = md.getTableName(index);
            if (tableAlias != null && !tableAlias.trim().isEmpty()) {
                columnMap.put(tableAlias + "." + columnName, index);
            }
        }
    }

    public Integer getColumnIndex(String columnName) {
        return columnMap.get(columnName);
    }

    public Integer getColumnIndex(String tableAlias, String columnName) {
        return columnMap.get(tableAlias + "." + columnName);
    }

}
Run Code Online (Sandbox Code Playgroud)