Oracle的树形递归查询可以使用Oracle中自带的方法:
start with ... connect by
语法格式是:
**select 字段名,字段名... from 表名 start with 根节点(字段名=字段值)connect by prior id = pId**
start with 表示以什么为根节点 ,如果不加限制 可以写 1=1 ;
connect by 后面是必须要加条件的,比如id = pId
prior 如果在 = 的前面表示以pId为根节点,在后面是另外一种含义了
可以这么理解:
prior child_Id = parent_Id 《=》 parent_Id = prior child_Id;
prior parent_Id = child_Id 《=》child_Id = prior parent_Id;
比如第一个就是找孩子:就是自顶向下的,第二个找父亲就是自底向上的;
实际开发中:
<select id="listUnitInfo" resultType="com.sout.admin.model" databaseId="oracle">
select distinct u.unit_code,
u.unit_name,
u.unit_tel,
u.para_unit_code
from lzcity_approve_unit_info u
start with 1 = 1
#非必需条件
<if test="unitCode != null and unitCode !=''">
and u.根节点字段名 = #{根节点}
</if>
#下面这个是必须要写的条件
<if test="unitName!=null and unitName!=''">
and u.unit_name like '%'|| #{unitName} ||'%'
</if>
connect by prior u.unit_code = u.para_unit_code
and u.unit_code <>u.para_unit_code
</select>
mysql实际开发中,实际上MySQL没有相应的函数/方法,这里借用一位前辈写的自定义函数加上MySQL自有的FIND_IN_SET函数来实现我自己的树形递归查询
xml式:
<select id="listUnitInfo" resultType="com.sout.admin.model" databaseId="mysql">
select distinct *
from frontsetting f
<where>
<if test="modelid != null and modelid !=''">
and find_in_set(f.modelid,getunitChildList(#{modelid}))
</if>
</where>
</select>
注解式:
@Select("select distinct * from frontsetting f where find_in_set(f.modelid,getunitChildList(#{modelid})")
List<FrontSetting> ModelCollection(String modelId);
自定义函数getunitChildList:
DELIMITER $$
USE `gd_base`$$
DROP FUNCTION IF EXISTS `getUnitChildList`$$
CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8
BEGIN
DECLARE sChildList VARCHAR(1000);
DECLARE sChildTemp VARCHAR(1000);
SET sChildTemp =CAST(rootId AS CHAR);
WHILE sChildTemp IS NOT NULL DO
IF (sChildList IS NOT NULL) THEN
SET sChildList = CONCAT(sChildList,',',sChildTemp);
ELSE
SET sChildList = CONCAT(sChildTemp);
END IF;
SELECT GROUP_CONCAT(modelid) INTO sChildTemp FROM frontsetting WHERE FIND_IN_SET(lastmodelid,sChildTemp)>0;
END WHILE;
RETURN sChildList;
END$$
DELIMITER ;
这个自定义函数有些部分需要改成自己的内容:
USE
gd_base
$$ 换成自己的数据库名
DEFINER=root
@%
换成自己的用户信息