MySQL查询取别名报错

1、问题背景

查询语句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中显示信息正常mysql

image

经过程序将查询的数据信息转换成Java类时,类中的属性所有都是nullsql

image

2、问题探索

经过MySQL中查出来的信息,应该会将字段信息映射到Java类的属性中,可是好像并非这么回事,只有深刻到源码中查询一下问题所在,以下图数据库

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

3、问题解决

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

image
一种经过方法ResultSetMetaData.getColumnLabel(),以下图
image
第二种是配置useOldAliasMetadataBehavior值为true,经过ResultSetMetaData.getColumnName()获取,该字段是经过数据库属性url来进行配置的,经过下面的配置能够将该字段赋值为true

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

复制代码

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

image

4、题外话

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

相关文章
相关标签/搜索