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 中显示信息正常
通过程序将查询的数据信息转换成 Java 类时, 类中的属性全部都是 null
二, 问题探索
通过 MySQL 中查出来的信息, 应该会将字段信息映射到 Java 类的属性中, 但是好像并不是这么回事, 只有深入到源码中查询一下问题所在, 如下图
代码中是通过 DAORowMapper 类将 MySQL 中查询的字段信息映射到 Java 类的属性中, 继续深入了解这个类
继续向下看这个方法, 下图中标出了关键的地方, 为什么没有执行类中的 setter 方法
继续向下查看, 就是通过反射将查询出的字段信息 set 到映射类的属性中
目前将字段信息映射到 Java 类中属性的关键代码地址找到了, debugger 查看 name 值为 "city_unit_name" 并不是 as 之后的别名 "disposeunitname"
继续深入发现这边有一个判断逻辑, 通过 useOldAliasBehavior 走哪个业务逻辑, 默认为 false, 通过 getNameNoAliases 方法获取字段名
查看该方法得知获取的字段名是 originalName
debug 得知 ResultSetMetaData 类的内部属性信息
从上面截图中发信 name 是我们需要获取的字段别名, 查看下图 我们应该走上面的判断逻辑通过 this.getField(column).getName() 获取字段别名, 因此需要将 useOldAliasBehavior 设置为 true
三, 问题解决
通过查询 MySQL 的相关资料得知获取字段的别名有两种方法,
一种通过方法 ResultSetMetaData.getColumnLabel(), 如下图
第二种是配置 useOldAliasMetadataBehavior 值为 true, 通过 ResultSetMetaData.getColumnName() 获取, 该字段是通过数据库属性 url 来进行配置的, 通过下面的配置可以将该字段赋值为 true
jdbc.url=jdbc:MySQL://localhost:3306/egovastat?useOldAliasMetadataBehavior=true
修改完毕之后, 查询的数据信息能够映射到 Java 类的属性中, 到这里该问题成功解决
四, 题外话
通过这次问题探索和问题解决, 感触较深. 我们对于一些框架的源码应该放下敬畏之心报以平常的心态查看源码, 通过查看源码来解决问题. 这种方法看似困难, 其实是最简单, 最高效. 同时, 以后也要多多查看优秀的源码, 学习别人的设计思想和代码习惯.
来源: https://juejin.im/post/5c76a4f3f265da2da53edd56