SqlRowSet是否无法识别列名别名?

时间:2013-01-28 02:31:59

标签: java spring jdbctemplate

我刚从使用普通旧连接切换到JdbcTemplate,当我运行我的应用程序时,我收到了这个:

org.springframework.jdbc.InvalidResultSetAccessException: Invalid column name; nested exception is java.sql.SQLException: Invalid column name

我发现当您使用其getXXX方法时,SqlRowSet无法识别列名别名。有没有办法使用SqlRowSet?或者我只需要使用这些列的完整列名称或索引?

提前致谢,

KTM

2 个答案:

答案 0 :(得分:1)

我不确定SqlRowSet,但如果你不需要一个断开连接的ResultSet(SqlRowSet),另一个选择是使用一个以RowMapper作为参数的查询方法。 RowMapper将传递一个ResultSet,它应该支持别名。

答案 1 :(得分:0)

在ResultSetWrappingSqlRowSet类中,

public class ResultSetWrappingSqlRowSet implements SqlRowSet

像getXXX这样的包装方法使用字段'label'而不是字段名称。

public int getInt(String columnLabel) throws InvalidResultSetAccessException {
    return getInt(findColumn(columnLabel));
}


public int findColumn(String columnLabel) throws InvalidResultSetAccessException {
    Integer columnIndex = this.columnLabelMap.get(columnLabel);
    if (columnIndex != null) {
        return columnIndex;
    }
    else {
        try {
            return this.resultSet.findColumn(columnLabel);
        }
        catch (SQLException se) {
            throw new InvalidResultSetAccessException(se);
        }
    }
}

ResultSetMetaData#getColumnLabel(int) doc link。

public ResultSetWrappingSqlRowSet(ResultSet resultSet) throws InvalidResultSetAccessException {
    this.resultSet = resultSet;
    try {
        this.rowSetMetaData = new ResultSetWrappingSqlRowSetMetaData(resultSet.getMetaData());
    }
    catch (SQLException se) {
        throw new InvalidResultSetAccessException(se);
    }
    try {
        ResultSetMetaData rsmd = resultSet.getMetaData();
        if (rsmd != null) {
            int columnCount = rsmd.getColumnCount();
            this.columnLabelMap = new HashMap<String, Integer>(columnCount);
            for (int i = 1; i <= columnCount; i++) {
                this.columnLabelMap.put(rsmd.getColumnLabel(i), i);
            }
        }
        else {
            this.columnLabelMap = Collections.emptyMap();
        }
    }
    catch (SQLException se) {
        throw new InvalidResultSetAccessException(se);
    }

}

所以你需要检查你的sql和数据库配置(支持从sql中获取数据库元数据)。