Spring JDBC ResultSetMetaData" getColumnName()"方法返回一个空字符串

时间:2016-12-06 09:47:54

标签: java spring jdbc resultset

我有以下代码部分来实现下拉菜单。根据从菜单中选择的两个参数,我通过将所选列替换为映射列名来运行相应的查询。

String sql = "SELECT ?, ? FROM <table_name>";

ArrayList<Some_POJO> res = this.jdbcTemplate.query(sql, new ResultSetExtractor<Some_POJO>()
    {//logic goes here.},
    user_inputs_as_object_array);

现在,在逻辑部分,我使用以下命令映射返回的值:

while(rs.next()) {
    Some_POJO = new SOME_POJO();
    Some_POJO.setParam1(rs.getString("SOME_COLUMN_NAME")); //ERROR
}

现在,当我按名称引用列时,标记的行会失败。但令人惊讶的是,以下解决方法有效:

while(rs.next()) {
    Some_POJO = new SOME_POJO();
    int i = 1;
    Some_POJO.setParam1(rs.getString(i)); //Works(?!)
}

我尝试修改JDBC模板调用以返回ResultSetMetaData对象而不是Some_POJO的ArrayList:

String sql = "SELECT ?, ? FROM <table_name>";

ResultSetMetaData res = this.jdbcTemplate.query(sql, new ResultSetExtractor<ResultSetMetaData>()
    {//extractData now returns rs.getMetaData()},
    user_inputs_as_object_array);

try
    {
        System.out.println("Column cout: " + res.getColumnCount());
        for(int i = 1; i <= res.getColumnCount(); i++)
            System.out.println("Label: " + res.getColumnLabel(i) +  "\nName: " + res.getColumnName(i));
    }
    catch(SQLException sqle)

只得到:

Column cout: 2
Label: :1
Name: 
Label: :2
Name:

是否有人可以了解正在发生的事情(除了建议完全重新设计的建议)什么是实现预期功能的最佳方式?我宁愿不使用列索引,因为订单更改会破坏功能。

1 个答案:

答案 0 :(得分:0)

仅用于重构代码,获取值为:

    ArrayList result = new ArrayList(0);
    result.addAll(this.jdbcTemplate.query(sql, (RowMapper) (rs, rowNum) -> {
        POJO out = new POJO();
        out.setProperty1(rs.getString("prop1"));
        out.setProperty2(rs.getString("prop2"));
        ...
        return out;
    }));

对我来说它运行正常,在方法中传递字段名称,不要认为spring jdbc存在一些问题。你的SQL查询可能有问题。