使用mysql-connector-java-5.1.27.jar,当select语句用到别名的时候报错:Column ×× not found 。
经查原因如下:
用apache beanutils包对resultSet进行dyanbean转换时发现别名无法识别
跟踪代码时发现mysql的jdbc实现的ResultSetMetaData.getColumnName(int column)方法中是这样的
publicString getColumnName(intcolumn)throwsSQLException {
if(this.useOldAliasBehavior) {
returngetField(column).getName();
}
String name = getField(column).getNameNoAliases();
if(name !=null&& name.length() ==0) {
returngetField(column).getName();
}
returnname;
}
其中this.useOldAliasBehavior 在执行过程中是false,也就是说会执行String name = getField(column).getNameNoAliases();方法
按照字面意思理解是从field中取非别名的名称,而Field.getNameNoAliases()的实现如下:
publicString getNameNoAliases()throwsSQLException {
if(this.useOldNameMetadata) {
returngetName();
}
if(this.connection !=null&&
this.connection.versionMeetsMinimum(4,1,0)) {
returngetOriginalName();
}
returngetName();
}
其中this.useOldNameMetadata也是false,因为版本号是5.1.29(数据库返回的信息),造成
if(this.connection !=null&&
this.connection.versionMeetsMinimum(4,1,0)) {
returngetOriginalName();
}
可以正常执行,返回结果return getOriginalName();
因此无法正常拿到别名。
解决方案如下:
连接串加参数:useOldAliasMetadataBehavior=true
示例:
url="jdbc:mysql://10.60.32.80:3306/paper2?characterEncoding=utf-8&useOldAliasMetadataBehavior=true"