1. ホーム
  2. java

[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0

2022-03-04 01:43:36

質問

Jdbctemplateを使って、DBから1つのString値を取得しています。 以下は私のメソッドです。

    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を返せばいいように思えますが。 どのように修正すればよいのでしょうか? 事前にありがとうございます。

解決方法は?

JdbcTemplateで, queryForInt , queryForLong , queryForObject これらのメソッドは、実行されたクエリが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
}