Как получить данные карты, используя JDBCTemplate.queryForMap

AWS cli делает это (предположительно, не выбирая и не повторяя все ключи в ковше), когда вы запускаете aws s3 ls s3://my-bucket/, поэтому я решил, что должен быть способ с помощью boto3.

https : //github.com/aws/aws-cli/blob/0fedc4c1b6a7aee13e2ed10c3ada778c702c22c3/awscli/customizations/s3/subcommands.py#L499

Похоже, что они действительно используют префикс и разделитель - I смог написать функцию, которая доставит мне все каталоги на корневом уровне ведра, немного изменив этот код:

def list_folders_in_bucket(bucket):
    paginator = boto3.client('s3').get_paginator('list_objects')
    folders = []
    iterator = paginator.paginate(Bucket=bucket, Prefix='', Delimiter='/', PaginationConfig={'PageSize': None})
    for response_data in iterator:
        prefixes = response_data.get('CommonPrefixes', [])
        for prefix in prefixes:
            prefix_name = prefix['Prefix']
            if prefix_name.endswith('/'):
                folders.append(prefix_name.rstrip('/'))
    return folders

29
задан hvgotcodes 5 April 2012 в 13:56
поделиться

3 ответа

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)

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

45
ответ дан hvgotcodes 5 April 2012 в 13:56
поделиться

Чтобы добавить ответ @ 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;
});
16
ответ дан cs_pupil 5 April 2012 в 13:56
поделиться

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

Просто реализуйте интерфейс 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

38
ответ дан Brian Beech 5 April 2012 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: