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