我在用apache beanutils包对resultSet进行dyanbean转换时发现别名无法识别
数据库mysql 5.1 驱动版本 mysql-connector-java-5.1.7
跟踪代码时发现mysql的jdbc实现的ResultSetMetaData.getColumnName(int column)方法中是这样的
public String getColumnName(int column) throws SQLException {
if (this.useOldAliasBehavior) {
return getField(column).getName();
} String name = getField(column).getNameNoAliases();

if (name != null && name.length() == 0) {
return getField(column).getName();
}

return name;
}
其中this.useOldAliasBehavior 在执行过程中是false,也就是说会执行String name = getField(column).getNameNoAliases();方法按照字面意思理解是从field中取非别名的名称,而Field.getNameNoAliases()的实现如下:public String getNameNoAliases() throws SQLException {
if (this.useOldNameMetadata) {
return getName();
} if (this.connection != null &&
this.connection.versionMeetsMinimum(4, 1, 0)) {
return getOriginalName();
} return getName();
}
其中this.useOldNameMetadata也是false,因为版本号是5.1.29(数据库返回的信息),造成
if (this.connection != null &&
this.connection.versionMeetsMinimum(4, 1, 0)) {
return getOriginalName();
}
可以正常执行,返回结果return getOriginalName();
因此无法正常拿到别名
table player
id
nametable user
id
player_id
name执行sql代码如下:
select a.id, a.name ,b.name as bname from player a, user b where a.id = b.player_id 在mysql中执行为id name  bname
1   xx   cc
2   aa   bb在java中运行,resultSet通过index获取没有问题,但是在resultSet.getMetaData的时候,通过metaData获取columnName时用Index获取字段名时就发现获取的字段为
id,name,name,完全获取的是originalName而不是想获取的别名
在hashMap中存取名称的时候就只剩下2个字段名id,name。有哪位兄弟知道改怎么配置,是在mysql server 中配置还是在java端配置connect的属性?

解决方案 »

  1.   

    我查了,这个是驱动mysql官方的jdbc,mysql5.1版本的server我也在unix和win下安装过,没有看到有什么可以影响jdbc在取别名时的参数
    本身一度怀疑是jdbc有问题,但是发现jdbc中是有orginial的选项参数,只是没有找到设置的地方。起码在datasource中没有,而且mysql 的jdbc 的connectionImpl是封装的,标准的jdbc接口中并没有提到别名实现的特性。因此这个实现是mysql自己完成的,这样的话,就是在jdbc访问数据库时由数据库返回的stream中加入的这些识别字段,包括驱动的版本信息什么的。不知道在mysql 的my.ini中是否有什么设置可以影响默认metadata取数据的参数
      

  2.   

    试试  getColumnLabel
    参看 http://blog.csdn.net/shuchengzhang/archive/2008/12/27/3621364.aspx