JDBC Template操作MySQL:别名列无法通过别名获取的替代方案
JDBC Template用MySQL别名取数报错的解决方案
问题本质
MySQL的JDBC驱动(Connector/J)默认有个特性:ResultSetMetaData.getColumnName()返回的是数据库里的原始列名(比如你这里的mongo_id),只有getColumnLabel()才会返回SQL里定义的别名(targeting_profile_mongo_id)。而JDBC Template默认是用getColumnName来匹配列名的,所以你用别名取值就会报「Invalid Column Name」。
不用遍历元数据的解决办法
最优方案:修改JDBC连接参数
在你的数据库连接URL里加上useColumnNamesInFindColumn=false,让驱动改用列别名(也就是getColumnLabel的返回值)来匹配查找列。示例连接URL:
jdbc:mysql://你的数据库地址:3306/目标库名?useUnicode=true&characterEncoding=utf8&useColumnNamesInFindColumn=false
加完这个参数后,直接用rs.getString("targeting_profile_mongo_id")就能正常取值,不用改查询语句,也不用写遍历元数据的代码。
备选方案(无需改全局连接配置)
如果没法调整全局连接参数,可以在自定义RowMapper时,针对目标字段通过列标签匹配索引,但这个方案仍需单次遍历元数据:
RowMapper<YourEntity> entityRowMapper = (rs, rowNum) -> { ResultSetMetaData metaData = rs.getMetaData(); int targetIndex = 0; for (int i = 1; i <= metaData.getColumnCount(); i++) { if ("targeting_profile_mongo_id".equals(metaData.getColumnLabel(i))) { targetIndex = i; break; } } YourEntity entity = new YourEntity(); entity.setTargetingProfileMongoId(rs.getString(targetIndex)); // 其他字段赋值逻辑 return entity; };
如果追求完全不碰元数据,优先选择修改连接参数的方案。
内容的提问来源于stack exchange,提问作者andresmonc
相关产品推荐
相关产品推荐

