5

我的问题类似于这里提出的问题:http: //forum.springsource.org/showthread.php?84508 -jdbctemplate.query()-sorted-result-set但没有提供明确的答案 -ArrayList不保证顺序.

基本上,我想知道返回的调用是否jdbcTemplate.query()保证结果集的顺序,以及是否可以将其转储到 a 中LinkedList并传递:)

谢谢!

编辑:我应该澄清查询确实包含一个order by子句,因此我需要一个保证顺序的结果集。我ArrayList不这样做是不正确的。由于 jdbcTemplate 是一个接口,因此实现将取决于 db 库。我应该假设ArrayList将使用 an 还是再次对其进行排序以确保安全?

4

3 回答 3

6

ArrayList 不保证顺序。

这是错误的。一个ArrayList 确实保证订单。它有一个get(int index)方法可用于从指定的基于 0 的索引中检索元素。该add(T item)方法会将它们按顺序添加到列表中。您可能会将 List 集合类型与 Set 接口混淆,后者类似于 List,但不保证顺序。

也就是说,它实际上并没有回答你的问题......

没有指定顺序的ResultSet,将按表的自然顺序返回数据。这通常基于 PK 字段,但并非所有 DBMS 都如此。

如果顺序很重要,请明确指定。即使它现在以所需的顺序返回,对 DB 模式的更改也可能会在以后影响这一点并破坏您的代码所做的假设。显式更好,并且更清楚地表达代码的意图。

从编辑到问题的更新: 如果在查询中指定了排序依据,您可以 100% 依赖结果集的顺序。无需再次排序。

于 2011-06-07T19:15:07.327 回答
2

这回答了你的问题了吗?

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.

没有结果集记录混合的地方。事实上,结果集更像是一个迭代器或流,而不是一个完整的集合。这意味着更改顺序将非常低效,因为您必须提前从结果集中加载所有记录。

于 2011-06-07T19:22:07.383 回答
0

如果您在 sql 中使用 order by condtion,则不需要再次对记录进行排序,请检查您的存储过程游标输出查询“OPEN o_provisionalOrders FOR SELECT cols from table order by condtion”是否正确。

于 2014-01-21T13:21:03.117 回答