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

如何使用Java对查询结果按tid去重?附相关代码示例

按tid去重获取唯一结果集的几种方法

方法一:数据库层面去重(推荐)

直接修改Repository的查询方法,利用SQL的DISTINCT或GROUP BY实现去重,这是性能最优的方式,避免在内存中处理大量数据。

比如修改JPQL查询:

@Query("SELECT DISTINCT t FROM onetable t WHERE t.tid = :tid")
Page<onetable> findtest(@Param("tid") Long tid, Pageable pageable);

或者用GROUP BY(若需聚合其他字段):

@Query("SELECT t FROM onetable t WHERE t.tid = :tid GROUP BY t.tid")
Page<onetable> findtest(@Param("tid") Long tid, Pageable pageable);

修改后,直接从datasetresults.getContent()拿到的就是去重后的结果,无需额外处理。

方法二:Java内存层面去重

如果无法修改查询逻辑,可在内存中通过Stream或集合实现去重:

方式1:利用Stream + Distinct(需重写equals/hashCode)

先确保onetable类基于tid重写equals()和hashCode()方法:

public class onetable {
    private Long tid;
    // 其他字段和方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        onetable onetable = (onetable) o;
        return Objects.equals(tid, onetable.tid);
    }

    @Override
    public int hashCode() {
        return Objects.hash(tid);
    }
}

然后通过Stream去重:

List<onetable> uniqueTables = datasetresults.getContent().stream()
    .filter(objArr -> objArr[0] instanceof onetable)
    .map(objArr -> (onetable) objArr[0])
    .distinct()
    .collect(Collectors.toList());

方式2:利用Collectors.toMap(无需重写equals/hashCode)

通过tid作为Map的键,自动覆盖重复项,最后取Map的值得到唯一结果:

import java.util.function.Function;
import java.util.stream.Collectors;

// ...

List<onetable> uniqueTables = datasetresults.getContent().stream()
    .filter(objArr -> objArr[0] instanceof onetable)
    .map(objArr -> (onetable) objArr[0])
    .collect(Collectors.toMap(
        onetable::getTid, // 以tid为键
        Function.identity(), // 值为对象本身
        (existing, newOne) -> existing // 重复时保留原有元素,也可改为newOne保留最新的
    ))
    .values()
    .stream()
    .collect(Collectors.toList());

方式3:利用TreeSet(无需重写equals/hashCode)

通过TreeSet的比较器基于tid去重:

import java.util.TreeSet;
import java.util.ArrayList;
import java.util.Comparator;

// ...

TreeSet<onetable> uniqueSet = new TreeSet<>(Comparator.comparing(onetable::getTid));
datasetresults.getContent().stream()
    .filter(objArr -> objArr[0] instanceof onetable)
    .map(objArr -> (onetable) objArr[0])
    .forEach(uniqueSet::add);

List<onetable> uniqueTables = new ArrayList<>(uniqueSet);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:26:30