在上一篇文章 Mybatis框架,以 paramDTO对象集合形式进行批量查询 中,我介绍了如何以 paramDTO 对象集合 的形式进行批量数据查询。在文章末尾,也说了批量查询中存在的一些坑。我们运行下面的SQL,来看看 以对象集合 的方式批量查询中的错误。
SELECT
u.id,
u.is_deleted,
u.NAME,
u.age,
u.create_date
FROM rk_user u
WHERE
u.is_deleted = 'n'
AND (
( 1 = 1 AND u.NAME = "张三三" AND u.age = 28 )
OR ( 1 = 1 AND u.NAME = "刘丽丽" AND u.age = 27 )
OR ( 1 = 1 AND u.NAME = "李四" AND u.age = 25 )
OR ( 1 = 1 AND u.NAME = "王小二" AND u.age = 18 )
OR ( 1 = 1 AND u.NAME = "李四" AND u.age = 25 )
)
ORDER BY
u.id DESC,
u.create_date DESC;
在上面的SQL (name + age) 的组合条件中, (u.NAME = "李四" AND u.age = 25) 的组合重复了,之所以会出现重复,是因为在入参 paramDTOList 中出现重复的数据。
paramDTOList中出现重复的 paramDTO 有时会导致查询的结果出现有重复的数据,因此需要对入参参数 paramDTOList 去重,对 SQL 进行去重。
对SQL去重比较简单,我们使用 DISTINCT 关键字即可实现。但对 paramDTOList 去重,不能直接使用 paramDTOList = paramDTOList.stream().distinct().collect(Collectors.toList()) , 因为 paramDTO 是一个对象,不是某个属性。
paramDTOList 集合对象去重,有好几种方式,具体实现可以参考我的文章: List集合DTO对象去重的三种方法 ,我推荐直接重写 paramDTO 对象中的 hashCode()、equals() 函数,或者在 paramDTO 对象上添加 lombok组件 的 @Data 注解。
2023年农历春节马上就要到了,祝大家好运绵绵。