如何在 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 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中对另一个选择查询的结果集执行选择查询

如何在 Pyspark 中对数据框进行排序 [重复]

在JSP系统中对ResultSet方法的调用总是报错

Java中如何对集合排序

如何在Java中对ArrayList进行排序[重复]

如何在 java 中对这个方法进行单元测试?