2013-07-02 21 views
5

我正在使用JdbcTemplate.query(sql, args, rowMapper)方法調用返回對象列表。在某些情況下,我想跳過一行而不將它添加到我返回的列表中。在這些情況下,我想到了兩種解決方案:當RowMapper返回null時,JdbcTemplate會做什麼?

  1. 讓RowMapper返回null。
  2. RowMapper拋出一個異常(我知道SQLExceptions被處理,所以這是一種可能性)。

我的問題是:當RowMapper.mapRow返回null時,JdbcTemplate是否將它添加到列表中?如果不是,我應該拋出一個SQLException嗎?

+1

你試過了嗎? –

+0

不應該跳過一行是sql中where子句的責任? – Storm

回答

6

這是一段代碼,添加行的結果列表

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

,我們可以看到它真的會加空。然而,沒有理由爲什麼RowMapper應該返回null,除非它有一個錯誤。

+0

這是Spring JDBC中讀取結果集的代碼,調用RowMapper並將結果添加到輸出列表中。顯然,如果RowMapper返回null,則會將null添加到列表中。由於'ArrayList'允許有'null'元素,因此它將返回一個帶有空值的列表。 –

1

當您返回null時,它確實會將此null添加到列表中,同樣,如果您拋出SQLException,它將被「包裝」到擴展RuntimeException的Exception中,因爲您不必顯式包含try-catch語句如果你不想。

+0

哦,所以JdbcTemplate處理任何RuntimeException - 不只是SQLException?很高興知道。 – ktm5124

+0

@ ktm5124我的意思是說,拋出的任何SQLException都被包裝成一個我現在不記得的名字,但它擴展了RuntimeException(不是一個檢查的異常),所以你不必輸入額外的try - catch – morgano

+0

您正在查找的異常的名稱是DataAccessException。 –

相關問題