queryForObject()は、レコードが見つからないときEmptyResultDataAccessExceptionをスローします

queryForObject()は、レコードが見つからない場合にEmptyResultDataAccessExceptionをスローします

レガシープロジェクトを確認し、次のSpring JDBCコードスニペットを見つけました。

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

    });

  }

問題

開発者は、レコードが見つからない場合はnullを返すと想定しています。

    User user = abc.getUser("example");
    if(user == null){
        //...do something
    }

問題は、レコードが見つからない場合にSpringがnullを返す代わりに、EmptyResultDataAccessExceptionをスローすることです。

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

溶液

nullを返すことはかなり標準的ですが、SpringがEmptyResultDataAccessExceptionをスローしたいのはなぜですか? 修正するには、例外をキャッチしてnullを返すだけです。

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