Java 当RowMapper返回null时,JdbcTemplate做什么?

Java 当RowMapper返回null时,JdbcTemplate做什么?,java,spring,jdbctemplate,Java,Spring,Jdbctemplate,我正在使用JdbcTemplate.query(sql、args、rowMapper)方法调用返回对象列表。在某些情况下,我希望跳过一行,而不将其添加到返回的列表中。在这些情况下,我想到了两种解决方案: 让行映射器返回null 让RowMapper抛出一个异常(我知道SQLExceptions已被处理,所以这是一种可能性) 我的问题是:当RowMapper.mapRow返回null时,JdbcTemplate是否将其添加到列表中?如果不是,我应该抛出SQLException吗?当您返回null时

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

  • 让行映射器返回null
  • 让RowMapper抛出一个异常(我知道SQLExceptions已被处理,所以这是一种可能性)

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

    当您返回null时,它确实会将该null添加到列表中,而且,如果您抛出SQLException,它会“包装”在扩展RuntimeException的异常中,如果不想,您不必显式地包含try-catch语句。

    这是一段将行添加到结果列表的代码

    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;
        }
        ...
    
    公共类RowMapperResultSetExtractor实现ResultTextExtractor{
    ...
    公共列表提取数据(结果集rs)引发SQLException{
    列表结果=(this.rowsExpected>0?新建ArrayList(this.rowsExpected):新建ArrayList());
    int rowNum=0;
    while(rs.next()){
    add(this.rowMapper.mapRow(rs,rowNum++));
    }
    返回结果;
    }
    ...
    

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

    在填充RowMapper后,您只需从列表中删除null即可

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

    哦,所以JdbcTemplate处理任何RuntimeException-不仅仅是SQLException?很高兴知道。@ktm5124我想说的是,任何抛出的SQLException都包装在一个异常中,我现在记不清它的确切名称,但它扩展了RuntimeException(不是选中的异常)因此,您不必键入额外的try-catch。您要查找的异常的名称是DataAccessException。这是Spring JDBC中读取结果集、调用行映射器并将结果添加到输出列表的代码。显然,如果行映射器返回null,null将添加到列表中。因为
    ArrayList
    允许
    null
    元素,这将返回一个包含null的列表。sql中的where子句不应该负责跳过一行吗?