jdbcTemplate.queryForList返回Map的列表,其中所有列值都为NULL

时间:2015-01-08 13:58:42

标签: jdbc spring-data spring-jdbc

使用jdbcTemplate.queryForList的任何调用都会返回一个包含所有列的NULL值的Maps列表。列应该有字符串值。

与在本机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方法的结果在每一行的所有列中都返回NULL?如何使用jdbcTemplate.queryForList获取我想要的结果?

xF8应该是字母ø所以我有一些编码问题,但我看不出这可能导致所有值 - 也包含不包含任何奇怪字母的字符串(第2行) - 变成NULL值从jdbcTemplate.queryForList方法返回的映射列表。

使用MySQL的jdbc驱动程序在MySQL Server 5.5数据库的另一台服务器上运行相同的代码。

1 个答案:

答案 0 :(得分:0)

使用MS SQL Server jdbc驱动程序而不是使用JDBC ODBC桥解决了该问题。我不知道为什么它不能在这座桥上工作。