web-dev-qa-db-fra.com

org.springframework.jdbc.IncorrectResultSetColumnCountException: Nombre de colonnes incorrect: attendu 1, effectif 38

J'utilise JdbcTemplate pour récupérer un haricot de la base de données. Voici ma méthode:

public List<trackerv3Livedata>  getTrackerData() {
    return List<trackerv3Livedata> live = (List<trackerv3Livedata>) jdbcTemplate.queryForList("select * from mmitrackerv3_livedata where accountid =?",new Object[]{aid}, trackerv3Livedata.class);
}

Et la structure du bean trackerv3Livedata suit:

public class trackerv3Livedata implements Serializable {

    private static final long serialVersionUID = 2409168269491619888L;

    private int deviceid;
    private Long timestamp;
    private Mmitrackerv3Device mmitrackerv3Device;
    private Mmitrackerv3Account mmitrackerv3Account;
    private double latitude;
    private double longitude;
    private Double altitude;
    private Double speedkph;
    private Double heading;
    private Double gpssignal;
    private Integer geozoneid;
    private Double distancekm;
    private Double gsmsignal;
    private Double mainpower;
    private Integer laststatustime;
    private Double internalbattry;
    private Double temperature;
    private Short dinput1;
    private Short dinput2;
    private Short dinput3;
    private Short dinput4;
    private Short dinput5;
    private Short dinput6;
    private Short dinput7;
    private Short dinput8;
    private Short ainput1;
    private Short ainput2;
    private Short ainput3;
    private Short ainput4;
    private Short doutput1;
    private Short doutput2;
    private Short doutput3;
    private Short doutput4;

    /* There are Some Getter And Setter Method With Constructor */
}

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

org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 38

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

7
user4894180

Cela se produit car la méthode queryForList que vous avez utilisée ne prendra pas en charge plusieurs colonnes. Voir l'implémentation de queryForList de JdbcTemplate

public <T> List<T> More ...queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException 
{
    return query(sql, args, getSingleColumnRowMapper(elementType));
}

La méthode getsingleColumnRowMapper () crée un nouveau RowMapper pour la lecture des objets de résultat à partir d'une seule colonne. Vous pouvez également utiliser la méthode indiquée ci-dessous.

public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException        
 {
    return query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper));
}
13
ajith george

L'implémentation de l'interface Bean RowMapper et de la fonction maprow résolvent ce problème 

public class Mmitrackerv3LivedataMapper implements RowMapper<Mmitrackerv3Livedata> {

@Override
public Mmitrackerv3Livedata mapRow(ResultSet rs, int rowNum)
        throws SQLException {
}

Et maintenant, j'ai un changement dans le modèle JDBC

 List<Mmitrackerv3Livedata> live = jdbcTemplate.query("select * from mmitrackerv3_livedata mlive " + 
 "join mmitrackerv3_device mdevice on mlive.accountid = mdevice.accountid where mlive.accountid = " +
     aid, new Mmitrackerv3LivedataMapper());

Merci @abhishek

3
user4894180

Essayez d'utiliser Rowmapper like comme si vous utilisiez query API.

J'espère que cela résoudra votre problème.

2
AbhishekAsh

Méthode JdbcTemplate

queryForList(String sql, Class<T> elementType)

est utile pour une-colonne-requêtes , vous ne pouvez spécifier que le type de colonne. Si vous avez besoin de plus d'une colonne dans ResultSet, son utilisation est plus précise.

query(String sql, RowMapper<T> rowMapper)

en tant qu’implémentation pour RowMapper, vous pouvez utiliser le vôtre ou

jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(clazz));

dans votre cas, cela peut être:

public List<Trackerv3Livedata> getTrackerData() {
    String sql = "SELECT * FROM mmitrackerv3_livedata mlive " +
                 "JOIN mmitrackerv3_device mdevice ON mlive.accountid = " +
                 "mdevice.accountid WHERE mlive.accountid = " + aid;

    return jdbcTemplate.query(sql,
            new BeanPropertyRowMapper<Trackerv3Livedata>(Trackerv3Livedata.class));
}
0
Drakonoved