我刚从使用普通旧连接切换到JdbcTemplate,当我运行我的应用程序时,我收到了这个:
org.springframework.jdbc.InvalidResultSetAccessException: Invalid column name; nested exception is java.sql.SQLException: Invalid column name
我发现当您使用其getXXX方法时,SqlRowSet无法识别列名别名。有没有办法使用SqlRowSet?或者我只需要使用这些列的完整列名称或索引?
提前致谢,
KTM
答案 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中获取数据库元数据)。