如果jdbc.queryForObject没有返回行,如何处理它

时间:2017-03-28 09:50:46

标签: mysql sql jdbc spring-jdbc jdbctemplate

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

saveLinkHistory列是mysql中的位(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行

我如何处理这种情况,只是抛出一个说明" name"不存在? 顺便问一下,Boolean好吗?因为我之前没有看到过这样的代码。

2 个答案:

答案 0 :(得分:3)

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;
    }
});

答案 1 :(得分:1)

尝试一下:

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