queryForObject () gibt eine EmptyResultDataAccessException aus, wenn der Datensatz nicht gefunden wurde

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 {

     //...
    public  T 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 static  T 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;
    }
  }