前几天在开发的过程中遇到一个递归查询的问题,java代码大致是这样的:
// 递归得到四级机构对象 public UserManagerDept getuserManagerDeptBy(String deptId) { UserManagerDept userManagerDept = null; userManagerDept = userManagerDeptService.getUserManagerDeptEntityBydeptId(deptId); if (null == userManagerDept) { return null; } if (!StringUtils.isNullOrEmpty(userManagerDept.getParentId())) { logger.info("***getParentId****" + userManagerDept.getParentId()); return getuserManagerDeptBy(userManagerDept.getParentId()); } else { return userManagerDept; } return null; }
逻辑是不是十分简单,但是一执行就死循环,并且一直循环到内存溢出,系统崩溃为止,有个同事一直在怀疑是不是内存太小了,但是我认为是不可能的,因为我们的运行服务器挺大的(2g), 实在找不到问题在哪,后来就换了种方式来实现递归, 那就是修改sql,将普通的sql查询语句,换成递归查询,下面上代码:
select t.* from ( select t.* from t_dept t start with t.dept_id = '1041001210001' connect by prior t.parent_id = t.dept_id) t where t.parent_id is null;
注意代码中高亮显示的内容,通过.....start with ...connect by prior...来实现递归查询,是不是看不太懂,再详细一点好了,
一,基本语法
SELECT ... FROM
(
SELECT ... FROM + 表名
START WITH + 条件1
CONNECT BY PRIOR + 条件2
)
WHERE + 条件3
二,应用场景
START WITH... CONNECT BY PRIOR...常见的用法,是用来遍历含有父子关系的表结构中。比如省市关系,一个省
下面包含多个城市,如果城市基本信息表中,包含有属于哪个省级的字段,那么如果要遍历所有的城市,我们就可以
使用START WITH... CONNECT BY PRIOR...。
如果该内容对您有所帮助,请打赏----1毛就足够感动我