easyUI tree 树形json的递归转换

解决了一个问题,做个记录.这里主要是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.java
public interface TestDaoI extends BaseDaoI<Departest>{

}
//TestDaoImpl.java
@Repository
public 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.java
public interface TestServiceI {

    //查找全部
    public List<Departest> findAllTestList();
    //查找一个
    public Departest findTest(int deip);

    //查多个
     public List<Departest> findTestList(int depid);
}
//TestServiceImpl.java
@Service
public 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中执行操作,获得数据

@Controller
public 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上,切记.至于为什么会这样我还不知道,有知道的朋友可以告诉我,以后了解清楚了,会写上去的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值