Java >> Tutoriel Java >  >> Tag >> String

Requête Jdbctemplate pour la chaîne :EmptyResultDataAccessException :taille de résultat incorrecte :1 attendu, 0 réel

J'utilise Jdbctemplate pour récupérer une seule valeur de chaîne à partir de la base de données. Voici ma méthode.

    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;
    }

Dans mon scénario, il est tout à fait possible de ne PAS obtenir de réponse à ma requête. Ma question est donc de savoir comment contourner le message d'erreur suivant.

EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

Il me semblerait que je devrais simplement récupérer un null au lieu de lancer une exception. Comment puis-je réparer cela? Merci d'avance.

Répondre

Dans JdbcTemplate , queryForInt , queryForLong , queryForObject toutes ces méthodes s'attendent à ce que la requête exécutée renvoie une et une seule ligne. Si vous n'obtenez aucune ligne ou plus d'une ligne, cela se traduira par IncorrectResultSizeDataAccessException . Maintenant, la bonne façon est de ne pas intercepter cette exception ou EmptyResultDataAccessException , mais assurez-vous que la requête que vous utilisez ne renvoie qu'une seule ligne. Si ce n'est pas possible, utilisez query méthode à la place.

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
}

Balise Java