mysql 起别名报错_MySQL 查询取别名报错

MySQL 查询取别名报错

一, 问题背景

查询语句 sql:"select b.city_unit_name as disposeunitname,a.city_event_src_name as eventsrcname from to_stat_info t,to_trans_event_src a,to_trans_unit b where t.event_src_name=a.event_src_name and t.dispose_unit_name = b.unit_name" 查询 MySQL 中显示信息正常

ab7653affab982b574eb7acc55df2e04.gif

通过程序将查询的数据信息转换成 Java 类时, 类中的属性全部都是 null

ab7653affab982b574eb7acc55df2e04.gif

二, 问题探索

通过 MySQL 中查出来的信息, 应该会将字段信息映射到 Java 类的属性中, 但是好像并不是这么回事, 只有深入到源码中查询一下问题所在, 如下图

ab7653affab982b574eb7acc55df2e04.gif

代码中是通过 DAORowMapper 类将 MySQL 中查询的字段信息映射到 Java 类的属性中, 继续深入了解这个类

ab7653affab982b574eb7acc55df2e04.gif

继续向下看这个方法, 下图中标出了关键的地方, 为什么没有执行类中的 setter 方法

ab7653affab982b574eb7acc55df2e04.gif

继续向下查看, 就是通过反射将查询出的字段信息 set 到映射类的属性中

ab7653affab982b574eb7acc55df2e04.gif

目前将字段信息映射到 Java 类中属性的关键代码地址找到了, debugger 查看 name 值为 "city_unit_name" 并不是 as 之后的别名 "disposeunitname"

ab7653affab982b574eb7acc55df2e04.gif

继续深入发现这边有一个判断逻辑, 通过 useOldAliasBehavior 走哪个业务逻辑, 默认为 false, 通过 getNameNoAliases 方法获取字段名

ab7653affab982b574eb7acc55df2e04.gif

查看该方法得知获取的字段名是 originalName

ab7653affab982b574eb7acc55df2e04.gif

debug 得知 ResultSetMetaData 类的内部属性信息

ab7653affab982b574eb7acc55df2e04.gif

从上面截图中发信 name 是我们需要获取的字段别名, 查看下图 我们应该走上面的判断逻辑通过 this.getField(column).getName() 获取字段别名, 因此需要将 useOldAliasBehavior 设置为 true

ab7653affab982b574eb7acc55df2e04.gif

三, 问题解决

通过查询 MySQL 的相关资料得知获取字段的别名有两种方法,

ab7653affab982b574eb7acc55df2e04.gif

一种通过方法 ResultSetMetaData.getColumnLabel(), 如下图

ab7653affab982b574eb7acc55df2e04.gif

第二种是配置 useOldAliasMetadataBehavior 值为 true, 通过 ResultSetMetaData.getColumnName() 获取, 该字段是通过数据库属性 url 来进行配置的, 通过下面的配置可以将该字段赋值为 true

jdbc.url=jdbc:MySQL://localhost:3306/egovastat?useOldAliasMetadataBehavior=true

修改完毕之后, 查询的数据信息能够映射到 Java 类的属性中, 到这里该问题成功解决

ab7653affab982b574eb7acc55df2e04.gif

四, 题外话

通过这次问题探索和问题解决, 感触较深. 我们对于一些框架的源码应该放下敬畏之心报以平常的心态查看源码, 通过查看源码来解决问题. 这种方法看似困难, 其实是最简单, 最高效. 同时, 以后也要多多查看优秀的源码, 学习别人的设计思想和代码习惯.

来源: https://juejin.im/post/5c76a4f3f265da2da53edd56

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值