jdbcTemplate query()保证维护结果集顺序?

时间:2011-06-07 18:56:06

标签: java spring sorting jdbctemplate

我的问题类似于此处提出的问题:http://forum.springsource.org/showthread.php?84508-jdbctemplate.query()-sorted-result-set但未提供明确答案 - ArrayList不保证订单。

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

谢谢!

编辑:我应该澄清一下,查询确实包含一个order by子句,因此我对结果集的要求保证了顺序。关于ArrayList没有这样做,我不正确。由于jdbcTemplate是一个接口,因此实现将依赖于db库。我是否应该假设将使用ArrayList或将其再次排序以保证安全?

3 个答案:

答案 0 :(得分:5)

  

ArrayList不保证订单。

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

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

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

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

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

答案 1 :(得分: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方法。

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

答案 2 :(得分:0)

如果您在sql中使用condtion命令,则不需要再次对记录进行排序, 检查存储过程游标输出查询“ OPEN o_provisionalOrders用于通过condtion从表顺序中选择cols “这是正确的。