这是queryForObject方法的源代码
@Nullable
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) throws
DataAccessException {
List<T> results = this.query(sql, rowMapper);
return DataAccessUtils.nullableSingleResult(results);
}
DataAccessUtils.nullableSingleResult
@Nullable
public static <T> T nullableSingleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
if (CollectionUtils.isEmpty(results)) {
throw new EmptyResultDataAccessException(1);
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
不知道为什么他们会在空集合上抛出异常,可能这只是从上面的方法复制粘贴来的。
public static <T> T requiredSingleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
if (CollectionUtils.isEmpty(results)) {
throw new EmptyResultDataAccessException(1);
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
他们应该使用的方法之上还有一步。
@Nullable
public static <T> T singleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
if (CollectionUtils.isEmpty(results)) {
return null;
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
NOW SOLUTION帮助了我:
扩展JdbcTemplate类(可以使用注入的DataSource构造它)
并覆盖queryForObject方法:
@Nullable
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) throws DataAccessException {
List<T> results = this.query(sql, rowMapper);
return DataAccessUtils.singleResult(results);
}
现在开始使用你的实现
不要忘记检查它是否适用于Spring版本更新(个人认为这很不可能)
EmptyResultDataAccessException
,那么整个事务不是会被 Spring 回滚吗?如何解决这个问题?例如,假设我们在同一个事务中运行几个其他查询/更新数据库的操作,其中一个操作抛出了EmptyResultDataAccessException
。 - Munish Chandel