web-dev-qa-db-fra.com

Comment obtenir des données cartographiques à l'aide de JDBCTemplate.queryForMap

Comment charger des données à partir de JDBCTemplate.queryForMap() et il retourne l'interface de carte. Comment les données de requête ont été maintenues en interne dans la carte. J'essaie de charger mais j'ai obtenu une exception inférieure, c'est-à-dire org.springframework .dao.IncorrectResultSizeDataAccessException: résultat incorrect

Code:-

public List getUserInfoByAlll() {
    List profilelist=new ArrayList();
    Map m=new HashMap();
    m=this.jdbctemplate.queryForMap("SELECT userid,username  FROM USER");
    Set s=m.keySet();
    Iterator it=s.iterator();
    while(it.hasNext()){
        String its=(String)it.next();
        Object ob=(Object)m.get(its);
        log.info("UserDAOImpl::getUserListSize()"+ob);
    }
    return profilelist;
}

Plz m'aider

30
user1127214

queryForMap est approprié si vous souhaitez obtenir une seule ligne. Vous sélectionnez sans clause where, donc vous voulez probablement queryForList. L'erreur est probablement indicative du fait que queryForMap veut une ligne, mais votre requête récupère plusieurs lignes.

Consultez la documentation. Il y a un queryForList qui ne prend que sql; le type de retour est un

List<Map<String,Object>>.

Donc, une fois que vous avez les résultats, vous pouvez faire ce que vous faites. Je ferais quelque chose comme

List results = template.queryForList(sql);

for (Map m : results){
   m.get('userid');
   m.get('username');
} 

Je vous laisse remplir les détails, mais je ne répéterais pas les touches dans ce cas. J'aime expliquer ce que j'attends.

Si vous avez un objet User et que vous voulez réellement charger des instances utilisateur, vous pouvez utiliser le queryForList qui prend sql et un type de classe

queryForList(String sql, Class<T> elementType)

(Wow Spring a beaucoup changé depuis que j'ai quitté le Javaland.)

46
hvgotcodes

Je sais que c'est vraiment vieux, mais c'est le moyen le plus simple de rechercher Map.

Implémentez simplement l'interface ResultSetExtractor pour définir le type que vous souhaitez renvoyer. Vous trouverez ci-dessous un exemple d'utilisation. Vous allez le cartographier manuellement, mais pour une carte simple, cela devrait être simple.

jdbcTemplate.query("select string1,string2 from table where x=1", new ResultSetExtractor<Map>(){
    @Override
    public Map extractData(ResultSet rs) throws SQLException,DataAccessException {
        HashMap<String,String> mapRet= new HashMap<String,String>();
        while(rs.next()){
            mapRet.put(rs.getString("string1"),rs.getString("string2"));
        }
        return mapRet;
    }
});

Cela vous donnera un type de retour de carte qui a plusieurs lignes (quelle que soit la quantité retournée par votre requête) et non une liste de cartes. Vous pouvez afficher les documents ResultSetExtractor ici: http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/jdbc/core/ResultSetExtractor.html

39
Brian Beech

Pour ajouter à la réponse de @ BrianBeech, cela est encore plus réduit dans Java 8:

jdbcTemplate.query("select string1,string2 from table where x=1", (ResultSet rs) -> {
    HashMap<String,String> results = new HashMap<>();
    while (rs.next()) {
        results.put(rs.getString("string1"), rs.getString("string2"));
    }
    return results;
});
18
cs_pupil