有一个需求,需要级联查询出树形菜单列表:
mapper:
public interface LawTypeInfoMapper extends BaseMapper<LawTypeInfo> {
LawTypeInfoVO selectTypeTree(@Param("id")Integer id);
}
bean:
@Data
@EqualsAndHashCode(callSuper = false)
public class LawTypeInfoVO implements Serializable {
@ApiModelProperty(value = "主键id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "类型名称")
private String name;
@ApiModelProperty(value = "父级id")
private Long pid;
@ApiModelProperty(value = "树节点")
private Integer degree;
@ApiModelProperty(value = "创建者")
private String createBy;
@ApiModelProperty(value = "更新者")
private String updateBy;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "更新时间")
private Date updateTime;
private List<LawTypeInfoVO> lawTypeInfoVOS;
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chinaunicom.dao.law.LawTypeInfoMapper">
<sql id="baseColumn">
id,`name`,pid,degree,create_by,update_by,create_time,update_time,flag
</sql>
<sql id="table_name">
law_type_info
</sql>
<resultMap id="tupeTree" type="com.chinaunicom.api.model.vo.law.LawTypeInfoVO">
<id property="id" column="id"></id>
<result column="name" property="name"></result>
<result column="pid" property="pid"></result>
<result column="degree" property="degree"></result>
<result column="create_by" property="createBy"></result>
<result column="update_by" property="updateBy"></result>
<result column="create_time" property="createTime"></result>
<result column="update_time" property="updateTime"></result>
<collection property="lawTypeInfoVOS" column="id" select="selectTreeById" ofType="com.chinaunicom.api.model.vo.law.LawTypeInfoVO"
javaType="java.util.ArrayList"></collection>
</resultMap>
<select id="selectTreeById" resultMap="tupeTree">
select <include refid="baseColumn"></include> from <include refid="table_name"></include>
where pid = #{id}
</select>
<select id="selectTypeTree" resultMap="tupeTree">
SELECT
id,
`name`,
pid,
degree,
create_by,
update_by,
create_time,
update_time,
flag
FROM law_type_info
<where>
<if test="id != null">
and id=#{id}
</if>
<if test="id == null">
and degree=0
</if>
and flag=1
</where>
</select>
</mapper>
查询出结果后,需要查出某一个菜单下的内容,包括所有子菜单下的内容,我们的思路是查出所有菜单及子菜单id,然后用in去检索。
查询目录:
List<Long> longs = null;
if (dto.getLawTypeId() != null) {
LawTypeInfoVO lawTypeInfoVO = lawTypeInfoMapper.selectTypeTree(dto.getLawTypeId());
if (lawTypeInfoVO == null) {
throw new BusinessException("目录结构不存在!");
}
longs = new ArrayList<>();
longs.add(lawTypeInfoVO.getId());
getTypeIds(longs, lawTypeInfoVO.getLawTypeInfoVOS());
}
利用递归回调遍历树
private void getTypeIds(List<Long> longs, List<LawTypeInfoVO> vo) {
for (LawTypeInfoVO v : vo
) {
longs.add(v.getId());
if (v.getLawTypeInfoVOS() != null && v.getLawTypeInfoVOS().size() > 0) {
getTypeIds(longs, v.getLawTypeInfoVOS());
}
}
}