【问题标题】:jdbcTemplate.queryForList returns list of Map where all column values are NULLjdbcTemplate.queryForList 返回所有列值为 NULL 的 Map 列表
【发布时间】:2015-01-08 13:58:42
【问题描述】:

任何使用 jdbcTemplate.queryForList 的调用都会返回一个 Map 列表,其中所有列的值为 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 方法的结果在每一行的所有列中都返回 NULL?如何使用 jdbcTemplate.queryForList 获得我想要的结果?

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

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

【问题讨论】:

  • 为什么使用 JDBC ODBC 桥接器?你可以试试微软或 jTDS JDBC 驱动程序吗?
  • 我没有将文件复制到该服务器的选项(它位于无法访问互联网的安全网络上)。我确实说服了客户的系统管理员将 MS SQL Server jdbc 驱动程序复制到服务器,这确实解决了问题。我不抱太大希望,因为我使用“普通”jdbc-code而不是在使用jdbcTemplate时获取数据。

标签: jdbc spring-data spring-jdbc


【解决方案1】:

问题已通过使用 MS SQL Server jdbc 驱动程序而不是使用 JDBC ODBC 桥来解决。不过我不知道为什么它不适用于桥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2017-08-19
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多