树数据获取当前id下所有的子id信息
sql的写法(自定义函数)
这里使用的是MySQL
自定义函数
CREATE FUNCTION `函数名`(rootId INT)
RETURNS VARCHAR(500)
BEGIN
DECLARE sTemp VARCHAR(500);
DECLARE sTempChd VARCHAR(500);
SET sTemp = '';
SET sTempChd =CAST(rootId AS CHAR);
WHILE sTempChd IS NOT NULL DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM 表名 WHERE FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
查询测试
select SUBSTRING(函数名(id),2)
这里解释一下为什么这样写?
id 为当前id 即你要查询所有子id的当前id
2 是因为查询结果中会默认拼接一个空的字符串和","
mapper写法
就仿照上边的sql去查询就可以了 把id动态传入即可
处理
因为我们查出来的是一个字符串 不能直接使用
所以这里我给转换成了int类型的集合
首先拿到sql查询出来的字符串(这里我用str表示)
//切割
String[] str1 = str.split(",");
//转int数组
int[] array = Arrays.stream(str1).mapToInt(Integer::parseInt).toArray();
//转int集合
List<Integer> list2 = Arrays.stream(array).boxed().collect(Collectors.toList());
这里之所以要转换成int类型的集合是因为后续查询对应信息
在做查询之前一定要给实体类加上一个字段(字段类型为List<Integer>
)
<select id="查询语句id" parameterType="实体类" resultMap="返回结果集">
<!--查询sql-->
<where>
<!--模糊匹配-->
<if test="实体类字段 != null and 实体类字段 != ''"> and 对应数据库字段 like concat('%', #{传入值}, '%')</if>
<!--其它省略-->
<if test="实体类定义的list字段.size>0">
and 子id in
<foreach collection="实体类定义的list字段" index="index" item="item" open="("
separator="," close=")">
#{实体类定义的list字段[${index}]}
</foreach>
</if>
</where>
这样就可以得到当前id下所有的子id数据!