11

我正在使用JdbcTemplate.query(sql, args, rowMapper)方法调用来返回对象列表。在某些情况下,我想跳过一行而不将其添加到我返回的列表中。在这些情况下,我想到了两种解决方案:

  1. 让 RowMapper 返回 null。
  2. 让 RowMapper 抛出一个异常(我知道 SQLExceptions 已处理,所以这是一种可能性)。

我的问题是:当RowMapper.mapRow返回 null 时,JdbcTemplate 是否将其添加到列表中?如果不是,我应该抛出一个 SQLException 吗?

4

3 回答 3

8

这是向结果列表添加行的代码

public class RowMapperResultSetExtractor<T> implements ResultSetExtractor<List<T>> {
    ...
    public List<T> extractData(ResultSet rs) throws SQLException {
        List<T> results = (this.rowsExpected > 0 ? new ArrayList<T>(this.rowsExpected) : new ArrayList<T>());
        int rowNum = 0;
        while (rs.next()) {
            results.add(this.rowMapper.mapRow(rs, rowNum++));
        }
        return results;
    }
    ...

正如我们所看到的,它确实会添加null。但是,除非存在错误,否则没有理由 RowMapper 应该返回 null。

于 2013-07-02T20:16:06.643 回答
2

使用 RowMapper 填充后,您可以简单地从列表中删除 null。

rows = JdbcTemplate.query(sql, args, rowMapper);
rows.removeAll(Collections.singletonList(null));
于 2019-05-06T21:35:10.583 回答
1

当您返回 null 时,它确实会将此 null 添加到列表中,此外,如果您抛出 SQLException,它会“包装”在扩展 RuntimeException 的异常中,因为如果您不这样做,则不必显式包含 try-catch 语句不想。

于 2013-07-02T20:11:14.690 回答