文字列のJdbctemplateクエリ: EmptyResultDataAccessException: 結果サイズが正しくありません: 予想サイズは1、実際は0 質問する

文字列のJdbctemplateクエリ: EmptyResultDataAccessException: 結果サイズが正しくありません: 予想サイズは1、実際は0 質問する

私は Jdbctemplate を使用して、データベースから単一の文字列値を取得しています。これが私の方法です。

    public String test() {
        String cert=null;
        String sql = "select ID_NMB_SRZ from codb_owner.TR_LTM_SLS_RTN 
             where id_str_rt = '999' and ID_NMB_SRZ = '60230009999999'";
        cert = (String) jdbc.queryForObject(sql, String.class); 
        return cert;
    }

私のシナリオでは、クエリにヒットしない可能性がまったくあるため、次のエラー メッセージを回避するにはどうすればよいかという質問です。

EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

例外をスローするのではなく、null を返すだけでよいと思われます。どうすればこれを修正できますか?

ベストアンサー1

JdbcTemplate 、、ではqueryForIntqueryForLongこのqueryForObjectようなメソッドはすべて、実行されたクエリが 1 行だけを返すことを想定しています。行が 1 つも取得されない場合、または複数の行が取得される場合は、 になりますIncorrectResultSizeDataAccessException。正しい方法は、この例外またはをキャッチするのではなくEmptyResultDataAccessException、使用しているクエリが 1 行だけを返すようにすることです。それが不可能な場合は、代わりに メソッドを使用しますquery

List<String> strLst = getJdbcTemplate().query(sql, new RowMapper<String>() {
    public String mapRow(ResultSet rs, int rowNum) throws SQLException {
        return rs.getString(1);
    }
});

if (strLst.isEmpty()) {
    return null;
} else if (strLst.size() == 1) { // list contains exactly 1 element
    return strLst.get(0);
} else { // list contains more than 1 element
         // either return 1st element or throw an exception
}

おすすめ記事