当RowMapper返回null时,JdbcTemplate会如何处理?

11

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

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

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


在 SQL 中,跳过一行或多行不应该由 WHERE 子句负责吗? - Storm
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。


1
这是Spring JDBC中的代码,它读取结果集,调用RowMapper,并将结果添加到输出列表中。显然,如果RowMapper返回null,将会将null添加到列表中。由于ArrayList允许包含null元素,因此返回的列表中将包含null值。 - Jim Garrison

3

在使用 RowMapper 填充列表后,您可以直接从列表中删除 null。

rows = JdbcTemplate.query(sql, args, rowMapper);
rows.removeAll(Collections.singletonList(null));

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

哦,所以JdbcTemplate处理任何RuntimeException - 不仅仅是SQLException?好知道。 - ktm5124
@ktm5124 我的意思是任何抛出的 SQLException 都被包装在一个异常中,我现在无法记住确切的名称,但它扩展了 RuntimeException(不是已检查的异常),因此您不必键入额外的 try-catch。 - morgano
你要查找的异常名称是 DataAccessException。 - Gustavo Guevara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接