阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL给字段取别名无法被JDBC解析的解决办法

104次阅读
没有评论

共计 1150 个字符,预计需要花费 3 分钟才能阅读完成。

项目上用的 Spring JDBC,是通过 ResultSetMetaData 接口来调用具体数据库的 JDBC 实现类来获取数据库返回结果集的。

在项目开发中,发现在 MySQL 中使用的别名没有办法被正常解析,意思就是说,给字段另外赋予的别名没有生效,取的是字段原来的字段名。具体是比如给 user_name 取了个别名为 user_name_old,最终返回的结果并不是别名 user_name_old,而是原名 user_name。

跟踪代码,发现在 MySQL 的 JDBC 实现中的 ResultSetMetaData.getColumnName(int column) 方法中存在一些特定的逻辑。

public String getColumnName(int column) throws SQLException {
if (this.useOldAliasBehavior) {// false
return this.getField(column).getName();
} else {
String name = this.getField(column).getNameNoAliases(); // 取非别名
return name != null && name.length() == 0 ? this.getField(column).getName() : name;
}
}

因为 this.useOldAliasBehavior 属性为 false,因此最终走的是 else 的逻辑,也就走的是 Field.getNameNoAliases() 方法。

public String getNameNoAliases() throws SQLException {
if (this.useOldNameMetadata) {// false
return this.getName();
} else {
return this.connection != null && this.connection.versionMeetsMinimum(4, 1, 0) ? this.getOriginalName() : this.getName();
}
}

因此我们最终把问题定位到 this.useOldAliasBehavior 属性上,这个属性是可以通过 JDBC 驱动地址配置的。

useOldAliasMetadataBehavior=true

完整的驱动地址应该是这样的:

jdbc:mysql://localhost/testDB?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useOldAliasMetadataBehavior=true

添加上该属性,就会发现问题得到了解决。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1150字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中