比如:
public class Menu(){
  private int id;
  private String name;
  private int pid;
  private List<Menu> menu;//二级菜单。}
就这样的!那么我用jdbc的话 我应该怎么查询呢。我是先查询一级.然后再根据pid去查询二级。这样子不对吧 这样用了什么N+1次查询。想知道 如何通过一次查询就能达到目的!即查询当前菜单以及其子菜单。
(还有我查询出来后 页面如何遍历为一颗树那种....一级作为根,二级作为叶子):
新闻列表
    --体育新闻
    --军事新闻
    --国际新闻
我可以这样遍历
${menu.name}(对应比如 新闻列表)
    ---
    ---
    ---
二级菜单如何遍历???
   
   

解决方案 »

  1.   

    还真不知道JDBC怎么实现,hibernate好像很容易
      

  2.   

    你的表中应用包括
    nodeId,parentNodeId  两个key。在init树的时候,要读表中的每一个记录,这也是必须的,因为每个记录都是你树上的节点。
    然后开始组装://step1:将所有node都初始化
    Node node = new Node(nodeId,xxx,xxx);
    ...
    //step2:建立关系
    node.setParent(getParentById(parentNodeId);
    ...
      

  3.   

    List<Menu> menu;//二级菜单。
    据此判断只存在一个menu表,这个表里有一个PID(上级菜单编号)字段第一个需求,就是全查吧(select * form menu)
    然后一点一点遍历这个结果集,把这个对象创建出来第二个需求,哈哈,来个歪招儿:重写Menu类的toString方法,在方法里把name和所有子菜单拼起来,这个不就递归输出了当然,这招可能有点损
      

  4.   

    Orcale好像专门有个SQL语句 生成树这样的结果集  以前老师演示过 你百度一下
      

  5.   

    如果是oracle直接有递归查询,其它数据库没办法,只能用代码实现了,数据库必须要有节点ID和上级节点ID,
    然后去网上下载个dTree(js写的树),用起来挺方便的,
      

  6.   

    全部查出来在自己遍历整个对象集构造分级树 js上有个很方便的zTree写好的传对象集的json过去自动帮你树形排列
      

  7.   

    参考:http://blog.csdn.net/m13666368773/article/details/7531592<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
         <title></title>
         <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
         <script type="text/javascript">
             $(document).ready(function () {
     
                 var zNodes = [
                 { id: 1, pId: 0, name: ".Net技术" },
                 { id: 2, pId: 0, name: "编程语言" },
                 { id: 3, pId: 0, name: "软件设计" },
                 { id: 4, pId: 1, name: ".Net新手区" },
                 { id: 5, pId: 1, name: "Asp.Net" },
                 { id: 6, pId: 1, name: "C#" },
                 { id: 7, pId: 1, name: "WinForm" },
                 { id: 8, pId: 4, name: ".Net码畜区" },
                 { id: 9, pId: 2, name: "Java" },
              ];
     
                 var setting = ["id", "pId"];
     
                 //第一步: 转化数据结构模型
                 var result = ToForest(zNodes, setting);
     
                 var mynode = "<ul>" + GetNodes(result) + "</ul>";
     
                 $("body").append(mynode);
     
             });
     
             var html = "";
     
             //第二步:深度优先(这里面的html格式可以自己更改)
             function GetNodes(result) {
                 for (var i = 0; i < result.length; i++) {
     
                     html += "<li>" + result[i].name;
     
                     if (result[i].childs != undefined) {
                         html += "<ul>";
                         GetNodes(result[i].childs);
                         html += "</ul>";
                     }
     
                     html += "</li>";
                 }
     
                 return html;
             }
     
             //setting的格式:[ID,Name,PID]
             function ToForest(sNodes, setting) {
                 var i, l,
     
                 //主键ID
                 key = setting[0];
     
                 //parentID
                 parentKey = setting[1];
     
                 //childs
                 childsKey = "childs";
     
                 //参数检查
                 if (!key || key == "" || !sNodes)
                     return [];
     
                 if ($.isArray(sNodes)) {
     
                     //存放森树形式的数据模型
                     var r = [];
     
                     //存放以ID为key,ID对应的实体为value
                     var tmpMap = [];
     
                     //赋值操作
                     for (i = 0; i < sNodes.length; i++) {
                         //获取当前的id
                         var id = sNodes[i][key];
     
                         tmpMap[id] = sNodes[i];
                     }
     
                     //对json逐层遍历确定层级关系
                     for (i = 0; i < sNodes.length; i++) {
     
                         //获取当前的pid
                         var pid = sNodes[i][parentKey];
     
                         //判断是否是顶级节点
                         if (tmpMap[pid]) {
                             //判断该节点是否有孩子节点
                             if (!tmpMap[pid][childsKey])
                                 tmpMap[pid][childsKey] = [];
                             //将此节点放在该节点的孩子中
                             tmpMap[pid][childsKey].push(sNodes[i]);
                         } else {
                             //如果是顶级节点直接存放
                             r.push(sNodes[i]);
                         }
                     }
                     return r;
                 } else {
                     return [sNodes];
                 }
             }
         </script>
     </head>
     <body>
     </body>
     </html>
      

  8.   

    嗯嗯,使用oracle的递归算法 ,前提是你的表中添加一个parent_id字段,,
    给个例子:
    select s.id,s.sj_parent_id,level from tb_subject s where s.sj_parent_id is not null 
         connect by s.sj_parent_id = prior s.id  start with id=69720 order by level
      

  9.   

    这是很容易的多表联查问题,你可以在主表中定义一个从表对象,在从表中定义一个set对象。