我的问题类似于此处提出的问题:http://forum.springsource.org/showthread.php?84508-jdbctemplate.query()-sorted-result-set但未提供明确答案 - ArrayList
不保证订单。
基本上,我想知道jdbcTemplate.query()
返回的调用是否保证结果集的顺序,以及我是否可以将其转储到LinkedList
并传递给它:)
谢谢!
编辑:我应该澄清一下,查询确实包含一个order by
子句,因此我对结果集的要求保证了顺序。关于ArrayList
没有这样做,我不正确。由于jdbcTemplate是一个接口,因此实现将依赖于db库。我是否应该假设将使用ArrayList
或将其再次排序以保证安全?
答案 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 “这是正确的。