2013-07-02 36 views
5

Sto utilizzando la chiamata al metodo JdbcTemplate.query(sql, args, rowMapper) per restituire un elenco di oggetti. Ci sono alcuni casi in cui voglio saltare una riga e non aggiungerla alla lista che ritorno. In questi casi, ho pensato a due soluzioni:Cosa fa JdbcTemplate quando RowMapper restituisce null?

  1. Avere RowMapper restituire null.
  2. Chiedi a RowMapper di generare un'eccezione (so che le SQLExceptions sono gestite, quindi questa è una possibilità).

La mia domanda è: quando RowMapper.mapRow restituisce nulla, JdbcTemplate lo aggiunge all'elenco? In caso contrario, dovrei invece lanciare un SQLException?

+1

Hai provato? –

+0

Non dovrebbe saltare una riga (s) essere la responsabilità della clausola where in sql? – Storm

risposta

6

Questo è il pezzo di codice che aggiunge righe alla lista dei risultati

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

come possiamo vedere sarà davvero aggiungere nulla. Tuttavia non vi è alcun motivo per cui RowMapper debba mai restituire null a meno che non ci sia un bug in esso.

+0

Questo è il codice in Spring JDBC che legge il set di risultati, chiama il RowMapper e aggiunge il risultato all'elenco di output. Chiaramente, se RowMapper restituisce null, verrà aggiunto null all'elenco. Poiché 'ArrayList' consente gli elementi' null', questo restituirà una lista con valori nulli al suo interno. –

1

Quando si restituisce null allora aggiunge effettivamente questo null all'elenco, inoltre, se si lancia un SQLException viene "incluso" in un'eccezione che estende RuntimeException, per non dover includere esplicitamente un'istruzione try-catch se non vuoi.

+0

Oh, quindi JdbcTemplate gestisce qualsiasi RuntimeException - non solo SQLException? Buono a sapersi. – ktm5124

+0

@ ktm5124 Ciò che intendevo dire è che qualsiasi SQLException generata è racchiusa in un'eccezione il cui nome esatto non riesco a ricordare in questo momento, ma estende RuntimeException (non un'eccezione controllata) in modo da non dover digitare try extra - catch – morgano

+0

Il nome dell'eccezione che stai cercando è DataAccessException. –

Problemi correlati