jdbcTemplate的query()方法是否保证维护结果集的顺序?

5
我的问题类似于这里提出的问题:http://forum.springsource.org/showthread.php?84508-jdbctemplate.query()-sorted-result-set,但是没有给出明确的答案 - ArrayList不能保证顺序。
基本上,我想知道由jdbcTemplate.query()返回的调用是否保证结果集的顺序,并且是否可以将其转储到LinkedList并传递:)
谢谢!
编辑:我应该澄清查询确实包括一个order by子句,因此我的要求是保证顺序的结果集。关于ArrayList不能保证顺序的说法是不正确的。由于jdbcTemplate是一个接口,其实现取决于db库。我应该假设将使用ArrayList还是再次排序以安全起见?
3个回答

6
一个ArrayList不能保证顺序。这是不正确的。ArrayList确实保证顺序。它有一个get(int index)方法,可以用来从指定的基于0的索引中检索元素。add(T item)方法会按顺序将它们添加到列表中。您可能会将List集合类型与Set接口混淆,在这种情况下,Set类似于List,但不保证顺序。
话虽如此,这并没有真正回答您的问题......
如果未指定排序,ResultSet将以表的自然顺序返回数据。通常基于主键字段,但这并非所有DBMS都是如此。
如果顺序很重要,请明确指定顺序以确保顺序。即使现在返回所需的顺序,对DB模式的更改可能会影响它,并破坏您的代码所做的假设。明确是更好的选择,并且将清楚地表达代码的意图。
更新问题后的编辑: 如果在查询中指定了order by,则可以100%依赖结果集的顺序。无需再次排序。

2
同意,你查询中的显式order by子句可能是你想要的。 - Kyri Sarantakos

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 中引用的。在 JdbcTemplate 的几个query()方法中使用。

不会出现结果集记录混合的情况。事实上,结果集更像是一个迭代器或流,而不是完整的集合。这意味着改变顺序将非常低效,因为您需要提前加载所有记录。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接