如何在 java 中对 ResultSet 进行排序?
Posted
技术标签:
【中文标题】如何在 java 中对 ResultSet 进行排序?【英文标题】:How can I sort ResultSet in java? 【发布时间】:2010-12-07 17:23:50 【问题描述】:顺便说一句,我不能在数据库中做 ORDER BY
【问题讨论】:
1.数据集有多大? 2.为什么ORDER BY
不是一个选项?
【参考方案1】:
将结果提取到List<YourResultType>
并使用Collections.sort()
。如果您只需要以一种“自然”顺序排序,则在结果类型本身中实现Comparable<T>
...否则每个排序顺序实现一次Comparator<T>
,并将相关比较器的实例传递给Collections.sort()
。
【讨论】:
我应该把它放回rs吗?我有很多东西叫 rs,我无法改变我需要 rs 保持原样但已排序 @user521180:你没有。重新设计您的解决方案。不能将数据库用于它设计的工作之一已经够糟糕了...... 如何将其放回 RS:您可以使用实现 ResultSet 的 CachedRowSet。但是,手动获取条目有点过时。尽管如此,它还是可以做到的。【参考方案2】:你在数据库中做ORDER BY
。
你应该重新评估为什么你不能这样做。如果有人问“我如何用锤子插入螺丝?顺便说一下我不会使用螺丝刀”,如果不说服他们首先使用螺丝刀是正确的解决方案,那将是不负责任的。
如果您真的,真的无法在本地对结果集进行排序,那么您就不走运了。它只是来自数据库的一个流,所以你必须将它全部读入一个临时的List
,对该集合进行排序,然后从那里开始。对于小型结果集,这可能不是问题,但对于大型结果集,这可能会对效率造成很大影响。
【讨论】:
在临时列表中排序后如何将其放回rs中? 你不能把它放回ResultSet
。根据定义,ResultSet 是从您的 select 语句返回的行,按照 select 语句返回的顺序。听起来您有架构问题,因为您不应该这样做。一旦你在你的List
中有了它,为什么不直接继续使用这些元素呢?
我看到无法在 SQL ORDER BY 中排序的一个原因是没有数据库支持自然排序。
另一个原因是每次重新查询数据库可能是不必要的资源浪费:如果我已经有我的rs,我不想在每次排序时重新加载它!【参考方案3】:
将数据从 ResultSet 中移出到您想要的任何对象表示中,然后对数据进行排序,就像此时您对任何其他数据一样。
如果您使用 Collections.Sort 对复杂对象执行排序,则需要实现 Comparator。
【讨论】:
【参考方案4】:可以在运行查询之前在数据库中对它进行排序,然后存储在resultSet中。
SELECT * FROM tableName ORDER BY columnName ASC
你想要这样的东西吗?
【讨论】:
【参考方案5】:看起来您必须负责使用自定义对象来实现 ResultSet 接口,该对象将为您提供您正在寻找的功能......对不起。
【讨论】:
【参考方案6】:这可以在查询本身中解决。您按计算列排序。您的计算列将自然值转换为可以按数字或字母顺序排序的值。您可以定义一个“转换”函数并在 order by 子句中调用该函数。
在某种程度上,无论是在您的代码中还是在数据库中,都必须进行自然到数字的转换。算法无论在哪里运行都是算法。
【讨论】:
如果您的数据库不支持功能,您可以通过“case statement”订购。您可以在布尔检查中潜入转换逻辑。功能是更好的解决方案。但毫无疑问,您正在寻找的解决方案是可能的。 这是 SQLServer 的一个疯狂示例,它将偶数排序在顶部,赔率在底部。 (就像一个自然排序示例)当 (SomeNumber%2)=0 then 0 else 1 end 时 select * from SomeTable order by case以上是关于如何在 java 中对 ResultSet 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章