【问题标题】:How to handle jdbc.queryForObject if it doesn't return a row如果 jdbc.queryForObject 不返回行,如何处理它
【发布时间】:2017-08-21 07:58:23
【问题描述】:

我想知道在我的情况下如何正确使用 jdbc。

saveLinkHistory 列是 mysql 中的 bit(1) 类型。

public boolean getIsSavedLinkHistory(String name) {
        String sql = "select saveLinkHistory from users where name = ?";
        Boolean isTracked = jdbcTemplateObject.queryForObject(sql, new Object[] { name }, Boolean.class);
        return isTracked;
}

查询运行良好,直到出现 Incorrect result size: expected 1, actual 0 错误,因为有时 name 不存在,queryForObject 方法期望我总是得到 1 行结果。

我该如何处理这种情况,只需抛出一个“名称”不存在的异常? 顺便说一句,Boolean 在这里好吗?因为我之前没有看到这样的代码。

【问题讨论】:

    标签: mysql sql jdbc spring-jdbc jdbctemplate


    【解决方案1】:

    试试这个:

    return DataAccessUtils.singleResult(jdbcTemplate.query(sql, new SingleColumnRowMapper<Boolean>(), param1, param2));
    

    【讨论】:

      【解决方案2】:

      JdbcTemplate 的 queryForObject 方法期望您的查询始终返回一行,否则它将抛出 EmptyResultDataAccessException。 您可以简单地使用带有 ResultSetExtractor 的查询方法而不是 queryForObject。 ResultSetExtractor - extractData(ResultSet rs) 方法将返回任意结果对象,如果没有返回数据,则返回 null。如果返回 null,您可以抛出相关异常。

       return jdbc.query(sql, new ResultSetExtractor<Boolean>() {
          @Override
          public Boolean extractData(ResultSet rs) throws SQLException,
                                                         DataAccessException {
              return rs.next() ? rs.getBoolean("column_name") : null;
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-28
        相关资源
        最近更新 更多