queryForObject () löst eine EmptyResultDataAccessException aus, wenn der Datensatz nicht gefunden wird
Überprüfen eines Legacy-Projekts und Auffinden dieser Spring JDBC-Codefragmente:
public User getUser(String username) { String sql = "SELECT * FROM USER WHERE username = ?"; return getJdbcTemplate().queryForObject( sql, new Object[] { username }, new RowMapper() { public UserAttempts mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setAge(rs.getInt("age")); user.setLastModified(rs.getDate("lastModified")); return user; } }); }
Problem
Der Entwickler geht davon aus, dass eine Null zurückgegeben wird, wenn der Datensatz nicht gefunden wird.
User user = abc.getUser("example"); if(user == null){ //...do something }
Das Problem ist, dass Spring einEmptyResultDataAccessException
auslöst, anstatt eine Null zurückzugeben, wenn der Datensatz nicht gefunden wird.
JdbcTemplate .java
package org.springframework.jdbc.core; public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { //... publicT queryForObject(String sql, Object[] args, RowMapper rowMapper) throws DataAccessException { List results = query(sql, args, new RowMapperResultSetExtractor (rowMapper, 1)); return DataAccessUtils.requiredSingleResult(results); }
DataAccessUtils.java
package org.springframework.dao.support; public abstract class DataAccessUtils { //... public staticT requiredSingleResult(Collection results) throws IncorrectResultSizeDataAccessException { int size = (results != null ? results.size() : 0); if (size == 0) { throw new EmptyResultDataAccessException(1); } if (results.size() > 1) { throw new IncorrectResultSizeDataAccessException(1, size); } return results.iterator().next(); }
P.S Spring version 3.2.8.RELEASE
Lösung
Die Rückgabe von null ist ziemlich normal. Fragen Sie sich, warum Spring einEmptyResultDataAccessException
werfen möchte. Um dies zu beheben, fangen Sie einfach die Ausnahme ab und geben null zurück.
public User getUser(String username) { String sql = "SELECT * FROM USER WHERE username = ?"; try { User user = getJdbcTemplate().queryForObject( sql, new Object[] { username }, new RowMapper() { public UserAttempts mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setAge(rs.getInt("age")); user.setLastModified(rs.getDate("lastModified")); return user; } }); return user; } catch (EmptyResultDataAccessException e) { return null; } }