easyUI tree 树形json的递归转换

来源:互联网 发布:心理测试 软件 编辑:程序博客网 时间:2024/06/06 12:39

解决了一个问题,做个记录.这里主要是json的转换,然后才是显示到tree上.
环境是eclipse+Maven+SpringMVC+hiberlate+easyuI(相关配置略)
开始吧!
第一步,建立一个实体类,这个实体类要定义为树形结构

@Entity@Table(name = "departest")@DynamicInsert(true)@DynamicUpdate(true)public class Departest {    private int id;    private String text;    private int depid;    private List children=new ArrayList();    //绑定属性和表中的字段    @Id    @Column(name = "de_id", unique = true,nullable = false, length = 64)    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    @Column(name = "de_name", nullable = false, length = 64)    public String getText() {        return text;    }    public void setText(String text) {        this.text = text;    }    @Column(name = "de_pid", nullable = false, length = 64)    public int getDepid() {        return depid;    }    public void setDepid(int depid) {        this.depid = depid;    }    //不需要绑定字段    @Transient     public List getChildren() {        return children;    }    public void setChildren(List children) {        this.children = children;    }}

hibernate会根据注解自动建立一张表,说明一下 hibernate中 @Entity @Table 实体类中不可以随便添加与表字段不对应的get方法,如果有请加注解 @Transient,
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic
表的结构为:
departest.table
第二步,在dao层写上要用到的方法

//TestDaoI.javapublic interface TestDaoI extends BaseDaoI<Departest>{}
//TestDaoImpl.java@Repositorypublic class TestDaoImpl  implements TestDaoI {    @Autowired    private SessionFactory sessionFactory;    /**     * 获得当前事物的session     *      * @return org.hibernate.Session     */    public Session getCurrentSession() {        return this.sessionFactory.getCurrentSession();    }    @Override    public Departest get(String hql, Map<String, Object> params) {        Query q = this.getCurrentSession().createQuery(hql);        if (params != null && !params.isEmpty()) {            for (String key : params.keySet()) {                q.setParameter(key, params.get(key));            }        }        List<Departest> l = q.list();        if (l != null && l.size() > 0) {            return l.get(0);        }        return null;    }    @Override    public List<Departest> find(String hql, Map<String, Object> params) {        Query q = this.getCurrentSession().createQuery(hql);        if (params != null && !params.isEmpty()) {            for (String key : params.keySet()) {                q.setParameter(key, params.get(key));            }        }        return q.list();    }}

第三步,在Service层写上具体的查询方法

//TestServiceI.javapublic interface TestServiceI {    //查找全部    public List<Departest> findAllTestList();    //查找一个    public Departest findTest(int deip);    //查多个     public List<Departest> findTestList(int depid);}
//TestServiceImpl.java@Servicepublic class TestServiceImpl implements TestServiceI {    @Autowired    private TestDaoI testDao;    @Override    public List<Departest> findAllTestList() {        List<Departest> tests=testDao.find("from Departest t");        return tests;    }    @Override    public Departest findTest(int deid) {        String hql="from Departest t where t.id=:deid";        Map<String, Object> params=new HashMap<>();        params.put("deid", deid);        Departest test =testDao.get(hql, params);        return test;    }    @Override    public List<Departest> findTestList(int depid) {        String hql="from Departest t where t.depid=:depid";        Map<String, Object> params=new HashMap<>();        params.put("depid", depid);        List<Departest> tests =testDao.find(hql, params);        return tests;    }}

第四步,在Controller中执行操作,获得数据

@Controllerpublic class DepartController {    /**测试**/    @Autowired     private TestServiceI testService;    @ResponseBody    @RequestMapping("/testree")    public List<Departest> Testree(){        List<Departest> tlist=new ArrayList<Departest>();//创建父节点集合        Departest tree=sdgTree(135064); //递归转换        tlist.add(tree);        return tlist;    }    //递归转换    public Departest sdgTree(int deid){        Departest test=testService.findTest(deid);//查找子节点获取单个对象        List<Departest> testlist=testService.findTestList(deid);//查找以这个节点为父节点的所有对象        for(Departest child:testlist){ //遍历集合            Departest da=sdgTree(child.getId());//递归查找            test.getChildren().add(da);         }        return test;    }    /**测试**/}

通过递归把查出来的数据转换为树形结构,

到这里就差不多完成了,贴出前台的代码:

<script type="text/javascript">         //加载树        $('#treelog').tree({            //这里引用的相对路径            url : '${mainPath}/testree',            checkbox:true,        });    </script>    <form id="treeForm" method="post">        <ul id="treelog"></ul>    </form>

部署到服务器上,输入地址 …/testree
就可以了,最后上效果图:
这里写图片描述

注意:返回数据的时候要返回一个树的集合List< Departest >,开始提到的
解决了一个问题,就是这个,如果返回树Departest 的话,数据打印出来是正确的,但就是无法显示在tree上,切记.至于为什么会这样我还不知道,有知道的朋友可以告诉我,以后了解清楚了,会写上去的

原创粉丝点击