【问题标题】:Spring JDBC ResultSetMetaData "getColumnName()" method returns an empty stringSpring JDBC ResultSetMetaData "getColumnName()" 方法返回一个空字符串
【发布时间】:2016-12-06 09:47:53
【问题描述】:

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

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:

能否请人阐明正在发生的事情以及(建议完全重新设计的建议除外)实现预期功能的最佳方式是什么?我不想使用列索引,因为顺序更改会破坏功能。

【问题讨论】:

  • 数据库可能会或可能不会返回名称,这取决于 JDBC 驱动程序。但是您还没有告诉您使用的是哪个数据库或 jdbc 驱动程序。
  • @M.Deinum 我们正在使用 SAP HANA 数据库,同样的 JDBC 驱动程序。但是,我不认为这是驱动程序的问题。在其他一些地方,我们没有将列设置为“?”/占位符,我们可以通过列名来引用列。我怀疑这是 Spring JDBC 内部工作方式的一些怪癖。
  • EHrm... 您只能在 where 子句中使用 ?... 其他任何地方都不能... 这与 spring 无关,而是 jdbc 的工作原理。
  • 另外,如果您只有 2 列,并且您不知道名称,如何在提取器中对其进行硬编码?!
  • @M.Deinum 这取决于数据库,有些数据库允许在选择中使用?,有些需要显式转换类型信息的参数,有些则完全不允许。

标签: java spring jdbc resultset


【解决方案1】:

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

    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 查询有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多