如果我们在数据库表中以类似如下的结构来保存树形结构:
id | parent_id | name |
1 | 0 | X市 |
2 | 1 | X市A区 |
3 | 1 | X市B区 |
4 | 2 | X市A区1街 |
同时又想要简短的递归来把数据组装成树形结构,那么以下是两个简短示例:
<resultMap id="organizationTreeResp" type="com.pingan.pcloud.lg.info.vo.resp.system.OrganizationTreeResp">
<id column="id" property="id"/>
<collection column="id" property="children" select="withAuthorityGetOrganizationTree"/>
</resultMap>
<select id="withAuthorityGetOrganizationTree" parameterType="long" resultMap="organizationTreeResp">
select * from auth_organization o WHERE o.is_del = 0 /*and o.*/ AND o.parent_id = #{id}
</select>
List<OrganizationTreeResp> withAuthorityGetOrganizationTree(@Param("id") Long id);
<resultMap id="permissionResp" type="com.pingan.pcloud.lg.info.vo.resp.system.PermissionResp">
<id column="id" property="id"/>
<collection column="{roleId=roleId, id=id}" property="childrenPermission" select="getPermissionTree"/>
</resultMap>
<select id="getPermissionTree" resultMap="permissionResp">
select o.*, #{roleId} roleId,
(CASE WHEN (EXISTS (SELECT 1 FROM auth_role_permission rp
WHERE rp.role_id = #{roleId} AND rp.permission_id = o.id)) THEN 1 ELSE 0 END) doesHaveThePermission
from auth_permission o WHERE o.is_del = 0 AND o.parent_id = #{id}
</select>
ArrayList<PermissionResp> getPermissionTree(@Param("id") Integer id, @Param("roleId") Integer roleId);