一次成功的mybatis-plus级联查询

有一个需求,需要级联查询出树形菜单列表:
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());
            }
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值