Search code examples
javaspringjdbctemplate

How to get Map data using JDBCTemplate.queryForMap


How to load data from JDBCTemplate.queryForMap() as it returns the Map Interface? How is the query data maintained internally in the map? I tried to load it, but I got this exception: org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result

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

Solution

  • queryForMap is appropriate if you want to get a single row. You are selecting without a where clause, so you probably want to queryForList. The error is probably indicative of the fact that queryForMap wants one row, but you query is retrieving many rows.

    Check out the docs. There is a queryForList that takes just sql; the return type is a

    List<Map<String,Object>>.

    So once you have the results, you can do what you are doing. I would do something like

    List results = template.queryForList(sql);
    
    for (Map m : results){
       m.get('userid');
       m.get('username');
    } 
    

    I'll let you fill in the details, but I would not iterate over keys in this case. I like to explicit about what I am expecting.

    If you have a User object, and you actually want to load User instances, you can use the queryForList that takes sql and a class type

    queryForList(String sql, Class<T> elementType)

    (wow Spring has changed a lot since I left Javaland.)