jdbcTemplate query () гарантированно поддерживает порядок набора результатов? - PullRequest
4 голосов
/ 07 июня 2011

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

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

Спасибо!

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

Ответы [ 3 ]

5 голосов
/ 07 июня 2011

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

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

Тем не менее, он фактически не отвечает на ваш вопрос ...

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

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

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

2 голосов
/ 07 июня 2011

Это отвечает на ваш вопрос?

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.

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

0 голосов
/ 21 января 2014

Нет необходимости снова сортировать записи, если вы используете порядок по условию в SQL, проверьте ваш запрос вывода хранимой процедуры " OPEN o_provisionalOrders FOR SELECT столбцы из таблицы в порядке расположения "это правильно.

...