2011-06-07 33 views
4

我的问题与此处询问的类似:http://forum.springsource.org/showthread.php?84508-jdbctemplate.query()-sorted-result-set但未提供明确答案 - ArrayList不保证顺序。jdbcTemplate query()保证保持结果集的顺序?

基本上,我想知道如果jdbcTemplate.query()回了电话,保证结果集的顺序,如果我能转储到一个LinkedList并将其传递:)

谢谢!

编辑:我应该澄清,查询确实包括一个order by子句,因此我需要一个结果集来保证顺序。我错误地认为ArrayList没有这样做。由于jdbcTemplate是一个接口,所以实现将取决于db库。我是否应该假定将使用ArrayList或重新排序以保证安全?

回答

4

ArrayList不保证顺序。

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

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

ResultSet,没有指定顺序,将在该表的自然顺序返回数据。这通常基于PK领域,但对于所有DBMS来说并非如此。

如果订单很重要,请指定它是确定的。即使现在按照所需顺序恢复,对数据库模式的更改也可能会在稍后影响此操作,并破坏代码所做的假设。明确表示会更好,并且会更清楚地表示代码的意图。

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

+2

一致认为,在你的查询中显式的order by子句可能是你想要的。 – 2011-06-07 19:20:14

+0

谢谢!这就是我一直在寻找的:) – 2011-06-07 21:01:59

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 condtion,重新排序记录 检查您的存储过程光标输出查询“用于condtion 从表顺序选择的cols OPEN o_provisionalOrders”是正确的。