如何解决空结果数据访问异常

时间:2019-05-21 17:49:19

标签: spring-mvc jdbctemplate named-parameters

org.springframework.dao.EmptyResultDataAccessException:错误的结果大小:预期为1,实际为0

NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}
@Override
public UserDetailModel getUserDetail(UserDetailModel detailModel) throws ClassNotFoundException, SQLException {
    StringBuilder query = new StringBuilder();
    Map map = new HashMap();
    SqlParameterSource param;
    query.append(" select ");
    query.append(" bu.FIRST_NAME as 'firstname', bu.LAST_NAME as 'lastname', bu.EMAIL as 'email', MOBILE as 'mobile', bu.ID  as 'id', ");
    query.append(" bu.ENABLED as 'enable', bu.IS_ADMIN as 'isadmin', bu.USERNAME as 'username', bu.PASSWORD as 'password' ");
    query.append(" from bamboo_users bu ");
    query.append(" where upper(trim(bu.USERNAME))=upper(trim(:USERNAME)) ");
    query.append(" AND ENABLED='1' ");
    map.put("USERNAME", detailModel.getUsername());
    param = new MapSqlParameterSource(map);
    return (UserDetailModel) jdbcTemplate.queryForObject(query.toString(), map, new UserRowMappers());
}

2 个答案:

答案 0 :(得分:0)

如果有可能得到一个空结果,请使用queryForList并仅在结果不止一个时返回一个值:

List<UserDetailModel> result = jdbcTemplate.queryForList(query.toString(), map, new UserRowMappers());
if (result.size>0) {
   return result.get(0)
}
return null;

答案 1 :(得分:0)

不要使用throw关键字,而是自己处理异常。

@Override
public UserDetailModel getUserDetail(UserDetailModel detailModel) {
    try {
        ...
        return (UserDetailModel) jdbcTemplate.queryForObject(query.toString(), map, new UserRowMappers());

    } catch(Exception e) {
        return null;
    }
}

1。将查询打印到控制台,以查看SQL语法是否格式正确。
2.如果您正在使用工作台之类的客户端程序,请使用查询执行。
3.确保您至少有一个数据。