如何从任何Java结构的SQL表中一次性检索层次项以进行比较?

问题描述 投票:0回答:3

我想从SQL表中以分层方式读取项目。例如我的桌子有亲子关系。以下是我的表结构:

id    name    parentId

1     abc      null

2     xyz        1

3     lmn        1

4     qwe       null

5     asd        4

因此,我想一次加载所有项目,如何做到这一点?我尝试了HashMap,但感觉非常复杂。预先感谢...

java mysql structure parent-child hierarchy
3个回答
1
投票

您可以通过一个SQL查询来检索整个层次结构,但是该查询取决于数据库系统-例如,Oracle支持对层次结构查询使用“ CONNECT BY”查询。 MySQL不直接支持此功能-但是在[[Hierachical Queries in MySQL中有一些非常好的方法说明。我建议您尝试其中之一。基本方法是创建一个模仿CONNECT BY的函数。


1
投票
首先,形成您的问题尚不清楚您是否需要SQL方面或Java数据结构方面的帮助。

我假设两者都需要从数据库中获取数据,然后填充到适当的Java数据结构中。

因此,没有直接的方法。您的数据主要是树结构,因此主要需要关注树的Java数据结构。因此,下面是您需要采取的步骤。

1)首先为树结构创建Java类结构。请参考下面的链接。

Java tree data-structure?

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数据使树类结构自行构建。


0
投票
第一个检索与该父对象相关的对象的创建方法:

公开列表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)+“)”;

© www.soinside.com 2019 - 2024. All rights reserved.