递归方法查询值

weixin_42466285 2018-07-04 02:34:41
java中,假设有个实体类表,三个字段id,parent_id,name。parent_id是可以重复的,一个parent_id有多条记录,通过parent_id查找记录,如果记录的id也存在于parent_id,就继续查。比如parent_id是4的记录有2条,id分别是5和6,然后再查parent_id是5和6的记录,代码怎么写,是递归吗
...全文
160 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2018-07-05
  • 打赏
  • 举报
回复
引用 5 楼 weixin_42466285 的回复:
[quote=引用 4 楼 maradona1984 的回复:]
oracle有递归查询,mysql自己写函数
当然层级小你用代码查也行,但不建议用递归,直接循环即可

这怎么循环呢[/quote]
所有递归都能改成循环,写个while(true)循环,循环里写查询即可,跳出条件是没有下级即可
weixin_42466285 2018-07-04
  • 打赏
  • 举报
回复
引用 8 楼 weixin_40852944 的回复:
[quote=引用 5 楼 weixin_42466285 的回复:]
[quote=引用 4 楼 maradona1984 的回复:]
oracle有递归查询,mysql自己写函数
当然层级小你用代码查也行,但不建议用递归,直接循环即可

这怎么循环呢[/quote]0.0 满足么[/quote]
膜拜
weixin_40852944 2018-07-04
  • 打赏
  • 举报
回复
引用 5 楼 weixin_42466285 的回复:
[quote=引用 4 楼 maradona1984 的回复:]
oracle有递归查询,mysql自己写函数
当然层级小你用代码查也行,但不建议用递归,直接循环即可

这怎么循环呢[/quote]0.0 满足么
weixin_40852944 2018-07-04
  • 打赏
  • 举报
回复
public class Test {
public static void main(String[] args) {
List<Root> roots = new ArrayList<>();
roots.add(new Root(1, "根节点", 0));
roots.add(new Root(2, "一级节点", 1));
roots.add(new Root(3, "一级节点", 1));
roots.add(new Root(4, "二级节点", 2));
roots.add(new Root(5, "二级节点", 2));
roots.add(new Root(6, "三级节点", 5));
Integer rootId = findRootId(5, roots);
System.out.println(rootId);
}

private static Integer findRootId(Integer parentId, List<Root> roots) {
Integer rootId = null;
for (Root root : roots) {
if (root.getId().compareTo(parentId) == 0) {
if (root.getParentId().compareTo(0) != 0) {
rootId = findRootId(root.getParentId(), roots);
} else {
rootId = root.getId();
}
}
}
return rootId;
}
}
class Root {

private Integer id;

private String name;

private Integer parentId;

public Root(Integer id, String name, Integer parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getParentId() {
return parentId;
}

public void setParentId(Integer parentId) {
this.parentId = parentId;
}
}
weixin_42466285 2018-07-04
  • 打赏
  • 举报
回复
引用 3 楼 zhuwangxiangbie 的回复:
递归查询

SELECT * FROM tableName START WITH parent_id=4 CONNECT BY PRIOR id=parent_id;

能在后端代码中实现吗,最好不在数据库里改sql语句
weixin_42466285 2018-07-04
  • 打赏
  • 举报
回复
引用 4 楼 maradona1984 的回复:
oracle有递归查询,mysql自己写函数
当然层级小你用代码查也行,但不建议用递归,直接循环即可

这怎么循环呢
maradona1984 2018-07-04
  • 打赏
  • 举报
回复
oracle有递归查询,mysql自己写函数
当然层级小你用代码查也行,但不建议用递归,直接循环即可
伫望-向北 2018-07-04
  • 打赏
  • 举报
回复
递归查询

SELECT * FROM tableName START WITH parent_id=4 CONNECT BY PRIOR id=parent_id;
weixin_42466285 2018-07-04
  • 打赏
  • 举报
回复
引用 1 楼 weixin_40852944 的回复:
嗯,根据递归,一直到 parent_id 为空或者为0的时候,才是最终的根节点

嗯,原理我明白,这个代码怎么写呢
weixin_40852944 2018-07-04
  • 打赏
  • 举报
回复
嗯,根据递归,一直到 parent_id 为空或者为0的时候,才是最终的根节点

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧