mysql给字段取别名无法被jdbc解析的解决办法
2024-08-29 21:37:07
项目上用的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
添加上该属性,就会发现问题得到了解决。
"我不能悲伤地坐在你身旁。"
最新文章
- DoTween 教程
- JS总结 节点
- Angularjs学习笔记(四)----与后端服务器通信
- Javascript模块化编程笔记
- SQLite介绍、学习笔记、性能测试
- 我的WPF控件库——KAN.WPF.XCtrl(141105)
- php去除数组中重复数据
- java程序练习:x进制转Y进制
- [NOIP2011普及组]瑞士轮 JAVA实现
- java 更改list 某一元素?
- 电子器件行业ERP实施案例
- 【java设计模式】【行为模式Behavioral Pattern】模板方法模式Template Method Pattern
- javaweb下载文件模板
- 利用Windows性能计数器(PerformanceCounter)监控
- php 获取用户的IP、地址、来源
- 【winform】splitContainer拆分器控件
- 基于DPDK的高效包处理系统
- 【转】Leveldb源码分析——1
- Android Studio修改项目中整体包名
- 404错误处理以及以后缀为action结尾的处理
热门文章
- IDEA+Maven 整合SSM框架实现简单的增删改查(新手入门,傻瓜操作)
- GoLand不同目录(包)方法调用
- 算法题-Z 字形变换
- python网络编程socketserver模块(实现TCP客户端/服务器)
- JavaScrip 之 DOM
- 解决“fatal: 'origin' does not appear to be a git repository...”
- BASH Shell 文件管理
- NGUI 源码分析- UIWidgetInspector
- MSP430系列单片机特性及应用领域
- Vue自定义指令使用场景