解决了一个问题,做个记录.这里主要是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
表的结构为:
第二步,在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上,切记.至于为什么会这样我还不知道,有知道的朋友可以告诉我,以后了解清楚了,会写上去的