You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Spring Boot中获取唯一aocDetailId:DISTINCT与Set哪个更高效?

在Spring Boot中获取唯一aocDetailId:选DISTINCT还是Set?

直接给结论:优先用代码块1的DISTINCT + List方案,原因如下:

核心区别

  • 代码块1:让数据库在查询阶段就完成去重,返回的结果已经是唯一值,再用List接收(还能保留ORDER BY的排序顺序)。
  • 代码块2:数据库返回所有符合条件的ID(包括重复项),然后在应用内存里靠Set的特性自动去重,而且Set是无序的,你加的ORDER BY完全起不到作用。

为什么DISTINCT更优?

  1. 减少数据传输:如果数据库里重复ID很多,DISTINCT能大幅削减返回给应用的数据量,既省带宽也减少应用端的内存开销。
  2. 数据库去重效率更高:数据库对这类去重操作有专门优化(比如利用索引),比在应用端把一堆重复数据塞进Set再去重的效率高得多。
  3. 保留排序逻辑:代码块2里的ORDER BY是白费功夫,因为Set不保证元素顺序,而List可以完美保留数据库排序后的结果。

什么时候用Set?

只有当你不仅需要唯一ID,还得先拿到所有原始重复数据做其他处理时,才考虑用Set顺便去重。如果只是为了获取唯一的aocDetailId,完全没必要多此一举。

代码块1(推荐实现)

@Query(value = "SELECT DISTINCT a.aocDetailId FROM aocParsedDetail a WHERE a.dateCreated >= ?1 AND a.aocParsingStatus = ?2 ORDER BY a.dateCreated")
List<String> findAocParsedDetailIdsOrderByDateCreated(@NotNull long dateCreated, EventStatus aocParsingStatus);

代码块2(仅特定场景适用)

@Query(value = "SELECT a.aocDetailId FROM aocParsedDetail a WHERE a.dateCreated >= ?1 AND a.aocParsingStatus = ?2 ORDER BY a.dateCreated")
Set<String> findAocParsedDetailIdsOrderByDateCreated(@NotNull long dateCreated, EventStatus aocParsingStatus);

内容的提问来源于stack exchange,提问作者icenerd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:29