mybatis中collection的使用,递归查询

<!--zyj new add 根据父级id查询子级数据 -->
<select id="findSysRoleFuncObjectTree" resultMap="cascadeLoadSysRoleFunc"  parameterType="sysFunctionVO">
SELECT CONCAT(#{srId}) AS sr_id,st.* FROM (SELECT * FROM sys_function WHERE sf_id IN 
(SELECT sf_id FROM sys_role_function WHERE sr_id = #{srId})) AS st
WHERE st.sys_sf_id = #{sfId} 
order by sf_order
</select> 

<!--zyj new add 根据父级获取子集返回对象-->
<resultMap id="cascadeLoadSysRoleFunc" type="sysFunctionVO">
<id property="sfId" column="sf_id" />
<result property="sfParentId" column="sys_sf_id" />
<result property="sfName" column="sf_name" />
<result property="sfOrder" column="sf_order" />
<result property="srId" column="sr_id" />
<collection property="sysFunctionVOList" column="{srId=sr_Id,srId=sr_Id,sfId=sf_id}" ofType="sysFunctionVO" javaType="java.util.ArrayList"
            select="findSysRoleFuncObjectTree"></collection>
</resultMap>



注意以上参数的个数,预编译需要几个,下面动态就要传递几个

MyBatis 进行递归查询可以使用递归语句(Recursive Statement)或递归查询(Recursive Query)来实现。 如果你使用的是 MySQL 数据库,可以使用递归语句来实现。以下是一个示例: ```xml <select id="selectById" resultMap="resultMap"> with recursive cte as ( select * from department where id = #{id} union all select d.* from department d join cte on d.parent_id = cte.id ) select * from cte </select> ``` 上面的代码使用 with recursive 声明了一个递归查询语句,查询了 id 等于参数值的部门及其子部门。递归查询语句的第一个 select 查询了初始部门,使用 union all 连接了一个子查询,该子查询使用 join 连接了部门表本身,查询了该部门的子部门。 如果你使用的是 Oracle 数据库,可以使用递归查询来实现。以下是一个示例: ```xml <select id="selectById" resultMap="resultMap"> select * from ( with cte(id, name, parent_id) as ( select id, name, parent_id from department where id = #{id} union all select d.id, d.name, d.parent_id from department d join cte on d.parent_id = cte.id ) select * from cte order by level desc ) where rownum = 1 </select> ``` 上面的代码使用 with 声明了一个递归查询语句,查询了 id 等于参数值的部门及其子部门。递归查询语句的第一个 select 查询了初始部门,使用 union all 连接了一个子查询,该子查询使用 join 连接了部门表本身,查询了该部门的子部门。最终的 select 语句使用了 order by 和 rownum 来获取最深层级的部门。 需要注意的是,递归查询语句的性能可能会受到影响,因此在实际使用需要进行优化和测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值