项目上用的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

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

"我不能悲伤地坐在你身旁。"

mysql给字段取别名无法被jdbc解析的解决办法的更多相关文章

  1. mysql合并查询结果及为表和字段取别名

    利用union关键字,可以给出多条select语句,并将它们的结果组合成单个的结果. 合并是,两个表对应的列数和数据类型必须相同. 各个select语句之间使用union或union all关键字分隔 ...

  2. ubuntu下修改mysql默认字符编码出现的Job failed to start解决办法

    ubuntu下修改mysql默认字符编码出现的Job failed to start解决办法 前几天卸掉了用了好多年的Windows,安装了Ubuntu12.04,就开始各种搭环境.今天装好了MySQ ...

  3. sqlyog连接Linux上的mysql报错误号码2013,错误号码1130的解决办法

    sqlyog连接Linux上的mysql报错误号码2013,错误号码1130的解决办法 1.报错误号码2013,可能是端口号不是默认的3306,需要改成对应的,检查命令是: [root@host et ...

  4. MySQL之Field‘***’doesn’t have a default value错误解决办法

    这篇文章主要介绍了MySQL之Field‘***’doesn’t have a default value错误解决办法,需要的朋友可以参考下 今天,中国博客联盟有博友反馈,zgboke.com无法提交 ...

  5. cloudera-scm-server启动出现Error creating bean with name 'entityManagerFactoryBean'与HHH010003: JDBC Driver class not found: com.mysql.jdbc.Driver错误解决办法(图文详解)

    不多说,直接上干货! 问题详情 -- ::, INFO main:com.cloudera.server.cmf.Main: Starting SCM Server. JVM Args: [-Dlog ...

  6. 使用net start mysql的时候出现服务名无效的原因及解决办法

    原因:mysql服务没有安装 解决办法:使用管理员权限,执行mysqld -install命令 然后以管理员身份net start mysql开启mysql服务 卸载mysql服务的方法 1.管理员权 ...

  7. pandas:字段值插入数据表第一行的解决办法

    1. 问题描述 在对课程表进行数据抽取时,由于课表结构的原因,需要在原始表字段名作为第一行数据,并对原始字段名进行替换. 原始数据如下所示: 2. 解决办法 经思考,此问题可抽象为:在不影响原始数据的 ...

  8. mySQL安装的时候一直卡在starting server这里解决办法

    昨天安装mySQL的时候一直卡在了starting server这里,等了半天都没反应,后来就去网上寻找解决办法,大部分是说什么设置mysql本地启动服务啊,删除注册表啊,这些办法都试过了 然并卵. ...

  9. 使用mysql连接django时,需要的步骤以及错误解决办法

    django默认使用的sqlite3,更改为SQL时需要按照如下操作进行 1.在settings.py中的78行进行更改 DATABASES = { 'default': { 'ENGINE': 'd ...

随机推荐

  1. 还不懂MySQL索引?这1次彻底搞懂B+树和B-树

    前言 看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree ...

  2. Spring Bean Scope (作用域)

    singleton: 单例模式,针对每个spring容器,只有一个该类的实例被管理,每次调用此实例都是同一个对象被返回,所以适用于无状态bean.默认情况下,singleton作为spring容器中b ...

  3. CCF-CSP题解 201809-4 再卖菜

    碎碎念..近视加老花,还以为第二天除了第二家范围在100以内别的都不确定,于是x**算的记搜复杂度超时了.还鼓捣着什么差分区间最长路,虽然有大神用差分区间做出来了,然而自己并没有看懂. 其实就是一个记 ...

  4. 花生日记_花生日记APP下载_花生日记官方网站

    花生日记 国内领先的社交电商导购分享平台. 独创社交电商3+模式,社交+电商+社群,上线1个月注册用户超百万.合作商家涵括各个类目以及平台.为数万宝妈提供月收入3000以上兼职收入. 微信扫描下方二维 ...

  5. C#程序编写高质量代码改善的157个建议【16-19】[动态数组、循环遍历、对象集合初始化]

    前言   软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ...

  6. java基础练习题

    1变量.运算符和类型转换:1.1手动输入一个学生的成绩,对这个成绩进行一次加分,加当前成绩的20%,输出加分后成绩 Scanner scan = new Scanner(System.in); Sys ...

  7. C语言笔记 04_运算符

    运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 ...

  8. Privacy Violation 侵犯隐私

  9. Redis 命令执行全过程分析

    今天我们来了解一下 Redis 命令执行的过程.我们曾简单的描述了一条命令的执行过程,本篇文章展示深入说明一下,加深大家对 Redis 的了解. 如下图所示,一条命令执行完成并且返回数据一共涉及三部分 ...

  10. Hive DDL、DML操作

    • 一.DDL操作(数据定义语言)包括:Create.Alter.Show.Drop等. • create database- 创建新数据库 • alter database - 修改数据库 • dr ...