jdbcTemplate.queryForList returns 所有列值为 NULL 的 Map 列表
jdbcTemplate.queryForList returns list of Map where all column values are NULL
任何使用 jdbcTemplate.queryForList return 的所有列都具有 NULL 值的映射列表的调用。这些列应该有字符串值。
与我在本机 SQL 客户端中运行相同查询时得到的结果相比,我确实得到了正确的行数。
我正在使用 JDBC ODBC 桥,数据库是 MS SQL server 2008。
我的 DAO 中有以下代码:
public List internalCodeDescriptions(String listID) {
List rows = jdbcTemplate.queryForList("select CODE, DESCRIPTION from CODE_DESCRIPTIONS where LIST_ID=? order by sort_order asc", new Object[] {listID});
//debugcode start
try {
Connection conn1 = jdbcTemplate.getDataSource().getConnection();
Statement stat = conn1.createStatement();
boolean sok = stat.execute("select code, description from code_descriptions where list_id='TRIGGER' order by sort_order asc");
if(sok) {
ResultSet rs = stat.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
String columnname1=rsmd.getColumnName(1);
String columnname2=rsmd.getColumnName(2);
int type1 = rsmd.getColumnType(1);
int type2 = rsmd.getColumnType(2);
String tn1 = rsmd.getColumnTypeName(1);
String tn2 = rsmd.getColumnTypeName(2);
log.debug("Testquery gave resultset with:");
log.debug("Column 1 -name:" + columnname1 + " -typeID:"+type1 + " -typeName:"+tn1);
log.debug("Column 2 -name:" + columnname2 + " -typeID:"+type2 + " -typeName:"+tn2);
int i=1;
while(rs.next()) {
String cd=rs.getString(1);
String desc=rs.getString(2);
log.debug("Row #"+i+": CODE='"+cd+"' DESCRIPTION='"+desc+"'");
i++;
}
} else {
log.debug("Query execution returned false");
}
} catch(SQLException se) {
log.debug("Something went haywire in the debug code:" + se.toString());
}
log.debug("Original jdbcTemplate list result gave:");
Iterator<Map<String, Object>> it1= rows.iterator();
while(it1.hasNext()) {
Map mm = (Map)it1.next();
log.debug("Map:"+mm);
String code=(String)mm.get("CODE");
String desc=(String)mm.get("description");
log.debug("CODE:"+code+" : "+desc);
}
//debugcode end
return rows;
}
如您所见,我添加了一些调试代码来列出 queryForList 的结果,我还从 jdbcTemplate 对象获取连接,并使用它使用基本 jdbc 方法 (listID='TRIGGER').
令我疑惑的是日志输出是这样的:
Testquery gave resultset with:
Column 1 -name:code -typeID:-9 -typeName:nvarchar
Column 2 -name:decription -typeID:-9 -typeName:nvarchar
Row #1: CODE='C1' DESCRIPTION='BlodoverxF8rin eller bruk av blodprodukter'
Row #2: CODE='C2' DESCRIPTION='Kodetilfelle, hjertestans/respirasjonstans'
Row #3: CODE='C3' DESCRIPTION='Akutt dialyse'
...
Row #58: CODE='S14' DESCRIPTION='Forekomst av hvilken som helst komplikasjon'
...
Original jdbcTemplate list result gave:
Map:(CODE=null, DESCRIPTION=null)
CODE:null : null
Map:(CODE=null, DESCRIPTION=null)
CODE:null : null
...
总共重复 58 次。
为什么 queryForList 方法的结果 return 每行的所有列中都为 NULL?如何使用 jdbcTemplate.queryForList 获得我想要的结果?
xF8 应该是字母 ø 所以我有一些编码问题,但我看不出这会如何导致所有值 - 包括不包含任何奇怪字母的字符串(se row#2) - 变成 NULL return 地图列表中的值来自 jdbcTemplate.queryForList 方法。
相同的代码在另一台服务器上针对 MySQL Server 5.5 数据库运行良好,使用 MySQL 的 jdbc 驱动程序。
问题已通过使用 MS SQL 服务器 jdbc 驱动程序而不是使用 JDBC ODBC 桥解决。我不知道为什么它不能与网桥一起使用。
任何使用 jdbcTemplate.queryForList return 的所有列都具有 NULL 值的映射列表的调用。这些列应该有字符串值。
与我在本机 SQL 客户端中运行相同查询时得到的结果相比,我确实得到了正确的行数。
我正在使用 JDBC ODBC 桥,数据库是 MS SQL server 2008。
我的 DAO 中有以下代码:
public List internalCodeDescriptions(String listID) {
List rows = jdbcTemplate.queryForList("select CODE, DESCRIPTION from CODE_DESCRIPTIONS where LIST_ID=? order by sort_order asc", new Object[] {listID});
//debugcode start
try {
Connection conn1 = jdbcTemplate.getDataSource().getConnection();
Statement stat = conn1.createStatement();
boolean sok = stat.execute("select code, description from code_descriptions where list_id='TRIGGER' order by sort_order asc");
if(sok) {
ResultSet rs = stat.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
String columnname1=rsmd.getColumnName(1);
String columnname2=rsmd.getColumnName(2);
int type1 = rsmd.getColumnType(1);
int type2 = rsmd.getColumnType(2);
String tn1 = rsmd.getColumnTypeName(1);
String tn2 = rsmd.getColumnTypeName(2);
log.debug("Testquery gave resultset with:");
log.debug("Column 1 -name:" + columnname1 + " -typeID:"+type1 + " -typeName:"+tn1);
log.debug("Column 2 -name:" + columnname2 + " -typeID:"+type2 + " -typeName:"+tn2);
int i=1;
while(rs.next()) {
String cd=rs.getString(1);
String desc=rs.getString(2);
log.debug("Row #"+i+": CODE='"+cd+"' DESCRIPTION='"+desc+"'");
i++;
}
} else {
log.debug("Query execution returned false");
}
} catch(SQLException se) {
log.debug("Something went haywire in the debug code:" + se.toString());
}
log.debug("Original jdbcTemplate list result gave:");
Iterator<Map<String, Object>> it1= rows.iterator();
while(it1.hasNext()) {
Map mm = (Map)it1.next();
log.debug("Map:"+mm);
String code=(String)mm.get("CODE");
String desc=(String)mm.get("description");
log.debug("CODE:"+code+" : "+desc);
}
//debugcode end
return rows;
}
如您所见,我添加了一些调试代码来列出 queryForList 的结果,我还从 jdbcTemplate 对象获取连接,并使用它使用基本 jdbc 方法 (listID='TRIGGER').
令我疑惑的是日志输出是这样的:
Testquery gave resultset with:
Column 1 -name:code -typeID:-9 -typeName:nvarchar
Column 2 -name:decription -typeID:-9 -typeName:nvarchar
Row #1: CODE='C1' DESCRIPTION='BlodoverxF8rin eller bruk av blodprodukter'
Row #2: CODE='C2' DESCRIPTION='Kodetilfelle, hjertestans/respirasjonstans'
Row #3: CODE='C3' DESCRIPTION='Akutt dialyse'
...
Row #58: CODE='S14' DESCRIPTION='Forekomst av hvilken som helst komplikasjon'
...
Original jdbcTemplate list result gave:
Map:(CODE=null, DESCRIPTION=null)
CODE:null : null
Map:(CODE=null, DESCRIPTION=null)
CODE:null : null
...
总共重复 58 次。
为什么 queryForList 方法的结果 return 每行的所有列中都为 NULL?如何使用 jdbcTemplate.queryForList 获得我想要的结果?
xF8 应该是字母 ø 所以我有一些编码问题,但我看不出这会如何导致所有值 - 包括不包含任何奇怪字母的字符串(se row#2) - 变成 NULL return 地图列表中的值来自 jdbcTemplate.queryForList 方法。
相同的代码在另一台服务器上针对 MySQL Server 5.5 数据库运行良好,使用 MySQL 的 jdbc 驱动程序。
问题已通过使用 MS SQL 服务器 jdbc 驱动程序而不是使用 JDBC ODBC 桥解决。我不知道为什么它不能与网桥一起使用。