关于mysql 数据库使用spring 2.0低版本 JdbcTemplate.queryForList 查询结果别名不起作用的解决方法
2014-09-17 09:37
1341 查看
1) 根据mysql jdbc驱动程序中com.mysql.jdbc.ResultSetMetaData 的源码
2) 修改spring.2.X.jar 文件中,org\springframework\jdbc\core\ColumnMapRowMapper.java
package org.springframework.jdbc.core;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;
import org.springframework.core.CollectionFactory;
import org.springframework.jdbc.support.JdbcUtils;
public class ColumnMapRowMapper
implements RowMapper
{
public Object mapRow(ResultSet rs, int rowNum)
throws SQLException
{
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map mapOfColValues = createColumnMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
<span style="color:#ff0000;"> String key = getColumnKey(rsmd.getColumnName(i));</span>
Object obj = getColumnValue(rs, i);
mapOfColValues.put(key, obj);
}
return mapOfColValues;
}
protected Map createColumnMap(int columnCount)
{
return CollectionFactory.createLinkedCaseInsensitiveMapIfPossible(columnCount);
}
protected String getColumnKey(String columnName)
{
return columnName;
}
protected Object getColumnValue(ResultSet rs, int index)
throws SQLException
{
return JdbcUtils.getResultSetValue(rs, index);
}
}修改红色部分,String key = getColumnKey(rsmd.getColumnLabel(i));
替换源码中的class 文件,
总结:两种方法都可以解决遇到的问题,但是推荐使用第一种方式,修改spring源码可能会对其他数据库造成影响。
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; }我们只需要在jdbc.url连接字符串的后面添加useOldAliasMetadataBehavior=true即可完美解决,如:jdbc:mysql://localhost:3306/goa30?characterEncoding=utf8&useOldAliasMetadataBehavior=true
2) 修改spring.2.X.jar 文件中,org\springframework\jdbc\core\ColumnMapRowMapper.java
package org.springframework.jdbc.core;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;
import org.springframework.core.CollectionFactory;
import org.springframework.jdbc.support.JdbcUtils;
public class ColumnMapRowMapper
implements RowMapper
{
public Object mapRow(ResultSet rs, int rowNum)
throws SQLException
{
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map mapOfColValues = createColumnMap(columnCount);
for (int i = 1; i <= columnCount; i++) {
<span style="color:#ff0000;"> String key = getColumnKey(rsmd.getColumnName(i));</span>
Object obj = getColumnValue(rs, i);
mapOfColValues.put(key, obj);
}
return mapOfColValues;
}
protected Map createColumnMap(int columnCount)
{
return CollectionFactory.createLinkedCaseInsensitiveMapIfPossible(columnCount);
}
protected String getColumnKey(String columnName)
{
return columnName;
}
protected Object getColumnValue(ResultSet rs, int index)
throws SQLException
{
return JdbcUtils.getResultSetValue(rs, index);
}
}修改红色部分,String key = getColumnKey(rsmd.getColumnLabel(i));
替换源码中的class 文件,
总结:两种方法都可以解决遇到的问题,但是推荐使用第一种方式,修改spring源码可能会对其他数据库造成影响。
相关文章推荐
- org.springframework.jdbc.core.simple.SimpleJdbcTemplate queryForMap 方法在查询结果为空时抛出异常
- 关于Spring jdbcTemplate.queryForList(sql)结果迭代
- 关于使用jdbc连接服务器MySQL无法使用中文查询的解决方法
- 使用SpringData JPAQL获取查询结果query.getResultList()读取后EntityManager会自动关闭
- spring jdbcTemplate 使用占位符(?)的query方法进行多表查询
- Java 使用JdbcTemplate 中的queryForList发生错误解决办法
- Spring中JDBCTemplate使用queryForObject方法时 ”Incorrect column count: expected 1, actual 5“错误
- Spring中使用JdbcTemplate的queryForObject方法,当查不到数据时会抛出如下异常:
- 在使用Spring中jdbcTemplate的QueryForObject()方法时异常:EmptyResultDataAccessException
- Oracle 数据库中在使用中文模糊查询时输入中文查询不到结果的解决方法
- Spring中使用JdbcTemplate的queryForObject方法,当查不到数据时会抛出如下异常:
- php使用mysql_query查询超大结果集超内存的解决方法
- 使用navicat for mysql 将查询语句过滤的结果导出成insert语句时没有带表名的解决办法
- [Bug]使用ST_Geometry查询结果不准确的解决方法
- 在此上下文中不允许使用子查询。只允许使用标量表达式。Insert 查询结果-解决方法
- 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致,很是郁闷,诡异
- java 用properties文件配置spring数据源,用spring的JdbcTemplate的queryForList查数据
- 升级Appserv中的php版本之后mysql报关于密码错误的解决方法#2000
- 关于在英创em9161板上使用ADO.net连接远程数据库提示 “无法找到 PInvoke dll"dbnetlib.dll"”问题解决方法
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象