Подтвердить что ты не робот

Как получить данные карты с помощью JDBCTemplate.queryForMap

Как загрузить данные из JDBCTemplate.queryForMap(), и он возвращает интерфейс Map.How поддерживается внутренними данными запроса в map.I пытается загрузить, но я получил ниже исключения, т.е. org.springframework.dao.IncorrectResultSizeDataAccessException: Неверный результат

Код: -

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 помогите мне

4b9b3361

Ответ 1

queryForMap подходит, если вы хотите получить одну строку. Вы выбираете без предложения where, поэтому вы, вероятно, захотите queryForList. Ошибка, вероятно, свидетельствует о том, что queryForMap хочет одну строку, но вы запрашиваете много строк.

Проверьте документы. Существует queryForList, который принимает только sql; тип возврата -

List<Map<String,Object>>.

Итак, как только у вас есть результаты, вы можете делать то, что делаете. Я бы сделал что-то вроде

List results = template.queryForList(sql);

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

Я позволю вам заполнить детали, но в этом случае я не буду перебирать ключи. Мне нравится говорить о том, чего я ожидаю.

Если у вас есть объект User и вы действительно хотите загрузить экземпляры пользователя, вы можете использовать queryForList, который принимает sql и тип класса

queryForList(String sql, Class<T> elementType)

(wow Spring сильно изменился с тех пор, как я покинул Джаваленд.)

Ответ 2

Я знаю, что это действительно старый, но это самый простой способ запроса Map.

Просто реализуйте интерфейс ResultSetExtractor, чтобы определить, какой тип вы хотите вернуть. Ниже приведен пример использования этого. Вы будете сопоставлять его вручную, но для простой карты это должно быть просто.

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

Это даст вам тип возврата Карты, который имеет несколько строк (сколько бы ваш запрос не возвращался), а не список Карт. Вы можете просмотреть документы ResultSetExtractor здесь: http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/jdbc/core/ResultSetExtractor.html

Ответ 3

Чтобы добавить к ответу @BrianBeech, это еще более урезано в 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;
});