org.springframework.dao.EmptyResultDataAccessException:不正な結果サイズ:予期される1、実際の0 1



Org Springframework Dao



JdbcTemplateの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)

DataAccessUtilsのソースコードを確認し、requiredSingleResultメソッドを見つけます。





[java] プレーンビュー コピー 印刷
  1. 公衆 静的T requiredSingleResult(コレクション結果)投げるIncorrectResultSizeDataAccessException {
  2. intサイズ=(結果!=ヌル? results.size():0)。
  3. もし(サイズ==0){
  4. スロー 新着EmptyResultDataAccessException(1)。
  5. }
  6. もし(results.size()>1){
  7. スロー 新着IncorrectResultSizeDataAccessException(1、サイズ)
  8. }
  9. 戻るresults.iterator()。next()
  10. }

検索クエリ結果が空の場合、サイズは0に割り当てられ、EmptyResultDataAccessExceptionがスローされます。これが理由です。 Springのこの設計は、ユーザーがnull値を判断するのを防ぎ、プログラムの堅牢性を確保するためのものである可能性があります。同時に、結果のサイズが1より大きい場合、単一のオブジェクトが返されるように例外もスローされます。


2つのオプション:



  1. queryForObjectまたはqueryForMapをqueryForLisまたはquery(inキーワードを使用してクエリデータマッピングBeanをクエリおよびカスタマイズできます)tメソッドに置き換えます。これら2つのメソッドには値が必要であり、空にすることはできないためです。リストvos = baseDao.getNamedParameterJdbcTemplate()。query(sql、parameterSource、new BeanPropertyRowMapper(ZwMultColumnAccountVo.class))

  2. この例外をキャッチするには、次のようにtry / catchを使用します


左折してください|右折