我想从SQL表中以分层方式读取项目。例如我的桌子有亲子关系。以下是我的表结构:
id name parentId
1 abc null
2 xyz 1
3 lmn 1
4 qwe null
5 asd 4
因此,我想一次加载所有项目,如何做到这一点?我尝试了HashMap,但感觉非常复杂。预先感谢...
您可以通过一个SQL查询来检索整个层次结构,但是该查询取决于数据库系统-例如,Oracle支持对层次结构查询使用“ CONNECT BY”查询。 MySQL不直接支持此功能-但是在[[Hierachical Queries in MySQL中有一些非常好的方法说明。我建议您尝试其中之一。基本方法是创建一个模仿CONNECT BY的函数。
我假设两者都需要从数据库中获取数据,然后填充到适当的Java数据结构中。
因此,没有直接的方法。您的数据主要是树结构,因此主要需要关注树的Java数据结构。因此,下面是您需要采取的步骤。
1)首先为树结构创建Java类结构。请参考下面的链接。
http://www.java2s.com/Code/Java/Collections-Data-Structure/Yourowntreewithgenericuserobject.htm
http://www.codeproject.com/Articles/14799/Populating-a-TreeView-Control-from-the-Database
2)如果最终需要Java对象,则从sql端不需要太多。因此,您可以执行简单的选择查询来获取数据。
3)现在,您需要使用第1步中的类结构来为数据准备树的辅助方法。如果您进行了更好的设计,则可以使用SQL数据使树类结构自行构建。
公开列表findChildrensOfParent(用户父级){TypedQuery tq =(TypedQuery)em.createQuery(“从用户u中选择uu.parent =:parent“,User.class);tq.setParameter(“ parent”,parent);
return tq.getResultList();
}
第二种方法生成的字符串具有所有相关子代的ID:私有字符串getIdsOfChildrends(用户){字符串ID =“”;
List<User> userList = new ArrayList<>(); userList.addAll(this.findUserBySupervisor(user)); int j = 0; if(userList.size() > 0) { ids = String.valueOf(user.getId()); do { userList.addAll(this.findUserBySupervisor(userList.get(j))); j++; }while(j < userList.size()); for(int i = 0; i < userList.size(); ids += "," + String.valueOf(userList.get(i)); } } else { ids += String.valueOf(user.getId()); } return ids; }
并且比通过传递父级来创建sql查询调用方法时要多:sql =“从用户c中选择c,其中c.id IN(” + this.getIdsOfChildrends(user)+“)”;