Spring EmptyResultDataAccessException异常的源码分析和解决方法

在spring中使用jdbcTemplate的queryForObject()方法时,如果查询的结果为空是会出现如下错误信息

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
	org.springframework.dao.support.DataAccessUtils.(DataAccessUtils.java:71)
	org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:729)
经查看源码时发现 找到requiredSingleResult方法:
  1. public static <T> T requiredSingleResult(Collection<T> results) throws IncorrectResultSizeDataAccessException {  
  2.         int size = (results != null ? results.size() : 0);  
  3.         if (size == 0) {  
  4.             throw new EmptyResultDataAccessException(1);  
  5.         }  
  6.         if (results.size() > 1) {  
  7.             throw new IncorrectResultSizeDataAccessException(1, size);  
  8.         }  
  9.         return results.iterator().next();  
  10.     }  

发现
当查询的result为空时,size赋值为0,并抛出EmptyResultDataAccessException异常,此为原因所在。猜测Spring这样设计可能是为了防止用户不对空值做出判断,保证了程序的健壮性。同时,当results的size大于1时同样会抛出异常,以保证返回单一的Object。


解决方法:就是在该方法上捕获异常即可

public boolean login(UsersBean usersBean) {
// TODO Auto-generated method stub
String sqlTemp = tradeSqlConfig.getSql(“login_user”);
String result;
try {
result = jdbcTemplate.queryForObject(sqlTemp,new Object[]{usersBean.getUserId(),usersBean.getPassword()},String.class);
} catch (DataAccessException e) {
result=null;
}
return result != null ? true : false;
}

    原文作者:Spring Cloud
    原文地址: https://blog.csdn.net/lg491733638/article/details/71601640
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞