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 }