如何使用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
相关产品推荐
相关产品推荐

