jdbcTemplate query () гарантированно поддерживает порядок набора результатов?

Мой вопрос аналогичен заданному здесь: http://forum.springsource.org/showthread.php?84508-jdbctemplate.query()-sorted-result-set, но четкий ответ не был предоставлен - ArrayList не гарантирует порядок.

По сути, я хотел бы знать, гарантирует ли вызов, возвращаемый jdbcTemplate.query(), порядок набора результатов, и могу ли я сбросить его в LinkedList и передать :)

Спасибо!

Изменить: я должен уточнить, что запрос включает предложение order by, следовательно, мои требования к набору результатов, гарантирующему порядок. Я был неправ относительно того, что ArrayList этого не сделал. Поскольку jdbcTemplate — это интерфейс, его реализация будет зависеть от библиотеки db. Должен ли я сделать предположение, что будет использоваться ArrayList, или отсортировать его снова, чтобы быть в безопасности?


person Victor Parmar    schedule 07.06.2011    source источник


Ответы (3)


Отвечает ли это на ваш вопрос?

public List<T> extractData(ResultSet rs) throws SQLException {
    List<T> results = (this.rowsExpected > 0 ? new ArrayList<T>(this.rowsExpected) : new ArrayList<T>());
    int rowNum = 0;
    while (rs.next()) {
        results.add(this.rowMapper.mapRow(rs, rowNum++));
    }
    return results;
}

Из RowMapperResultSetExtractor. Этот класс используется в нескольких методах query() в JdbcTemplate.

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

person Tomasz Nurkiewicz    schedule 07.06.2011

ArrayList не гарантирует порядок.

Это неправильно. ArrayList гарантийный заказ. Он имеет метод get(int index), который можно использовать для извлечения элемента из указанного индекса, начинающегося с 0. Метод add(T item) последовательно добавит их в список. Возможно, вы путаете тип коллекции List с интерфейсом Set, который похож на список, за исключением того, что он не гарантирует порядок.

Тем не менее, это на самом деле не отвечает на ваш вопрос...

ResultSet без указания порядка вернет данные в естественном порядке таблицы. Обычно это основано на полях PK, но это верно не для всех СУБД.

Если порядок важен, укажите его, чтобы быть уверенным. Даже если он вернется в желаемом порядке сейчас, изменения в схеме БД могут повлиять на это позже и нарушить предположения, сделанные вашим кодом. Явность лучше, и цель кода будет выражена яснее.

Обновление от редактирования к вопросу. Если в запросе указан порядок, вы можете на 100 % полагаться на порядок набора результатов. Нет необходимости сортировать его снова.

person Jesse Webb    schedule 07.06.2011
comment
Согласитесь, явное предложение order by в вашем запросе, вероятно, то, что вам нужно. - person Kyri Sarantakos; 07.06.2011
comment
Спасибо! Это то, что я искал :) - person Victor Parmar; 08.06.2011

Не требуется снова сортировать записи, если вы используете порядок по условию в sql, проверьте правильность запроса вывода курсора хранимой процедуры «OPEN o_provisionalOrders FOR SELECT cols from table order by condtion».

person V.R.Manivannan    schedule 21.01.2014