关于 JdbcTemplate 查询结果中列名变成大写的问题,这是由于数据库和 JDBC 驱动的默认行为导致的。以下是几种解决方案:
问题原因
数据库驱动行为:某些数据库驱动(如 Oracle)默认将列名转换为大写
JDBC 规范:JDBC 规范允许驱动程序以特定方式处理列名大小写
列名引用方式:使用 SELECT column 而不是 SELECT "column" 可能导致大小写处理问题
解决方案
-
使用别名保持原始大小写````
String sql = "SELECT user_id as "userId", user_name as "userName" FROM users";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql); -
配置数据源保持列名大小写(以 Oracle 为例)
// 在连接字符串中添加属性
String url = "jdbc:oracle:thin:@localhost:1521:xe";
Properties props = new Properties();
props.setProperty("user", "username");
props.setProperty("password", "password");
props.setProperty("oracle.jdbc.mapNameToUpperCase", "false"); // 保持大小写 -
自定义 RowMapper 处理列名
List<Map<String, Object>> result = jdbcTemplate.query(sql, new RowMapper<Map<String, Object>>() {
@Override
public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
Map<String, Object> row = new LinkedHashMap<>();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();for (int i = 1; i <= columnCount; i++) {String columnName = metaData.getColumnLabel(i); // 使用 getColumnLabel 保持别名row.put(columnName, rs.getObject(i));}return row;
}
}); -
后处理转换列名
List<Map<String, Object>> originalResult = jdbcTemplate.queryForList(sql);
List<Map<String, Object>> processedResult = originalResult.stream().map(row -> {
Map<String, Object> newRow = new LinkedHashMap<>();
row.forEach((key, value) -> {
// 根据需要转换列名,例如转为小写或驼峰命名
String newKey = key.toLowerCase(); // 或其他转换逻辑
newRow.put(newKey, value);
});
return newRow;
}).collect(Collectors.toList()); -
使用 ColumnMapRowMapper 自定义实现
public class CaseSensitiveColumnMapRowMapper implements RowMapper<Map<String, Object>> {
@Override
public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
Map<String, Object> map = new LinkedHashMap<>();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();for (int index = 1; index <= columnCount; index++) {String column = rsmd.getColumnLabel(index); // 使用 label 而非 namemap.put(column, rs.getObject(index));}return map;
}
}
// 使用方式
List<Map<String, Object>> result = jdbcTemplate.query(sql, new CaseSensitiveColumnMapRowMapper());