在spring下,db使用queryForMap時,出現的錯誤。
原因:select salary from user where 1 = 2 的結果是 salary (返回第0行),會抛出IncorrectResultSizeDataAccessException。
所以最好還是用queryForList, 返回的list的size為0,表示找不到資料。除非確定資料select出來一定至少有一筆,才使用queryForMap。
原始程式:
public Map queryForMap(String sql) throws DataAccessException {
return (Map) queryForObject(sql, getColumnMapRowMapper());
}
--------------------------------------------------------------------------------------------------------
public Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper) throws DataAccessException {
List results = (List) query(sql, args, argTypes, new RowMapperResultSetExtractor(rowMapper, 1));
return DataAccessUtils.requiredUniqueResult(results);
}
public Object queryForObject(String sql, Object[] args, RowMapper rowMapper) throws DataAccessException {
List results = (List) query(sql, args, new RowMapperResultSetExtractor(rowMapper, 1));
return DataAccessUtils.requiredUniqueResult(results);
}
public Object queryForObject(String sql, RowMapper rowMapper) throws DataAccessException {
List results = query(sql, rowMapper);
return DataAccessUtils.requiredUniqueResult(results);
}
--------------------------------------------------------------------------------------------------------
public static Object requiredUniqueResult(Collection results) throws IncorrectResultSizeDataAccessException {
int size = (results != null ? results.size() : 0);
if (size == 0) {
throw new EmptyResultDataAccessException(1);
}
if (!CollectionUtils.hasUniqueObject(results)) {
throw new IncorrectResultSizeDataAccessException(1, size); //問題在這裡
}
return results.iterator().next();
}
沒有留言:
張貼留言