如何使用SQL或JPA确定记录的层次结构

MDP

我有一个确定菜单链接层次结构并构建面包屑的系统。我有2张桌子:VoceVoci

Voce既是菜单链接名称又是页面标题名称。Voci代表的层次结构Voce每个人都Voce可以有另一个Voce儿子(这里您看不到相关代码,无论如何,我使用JPA将Voce绑定到许多Voci)。例如,这是页面/链接“添加许多项目”的层次结构:menu --> manage menu --> add many items.

 ----------
|         |
|        \/           Voce
|       -----------------------
|       |id |      name       |    
|       -----------------------
|       |1  |menu             |   
|      -----------------------
|       |2  |manage menu      |  
|       -----------------------
|       |3  |add single item  |
|       -----------------------
|       |4  |add many items   |
|       -----------------------
|
|_____________
        |     |
        |     |
Voci    |     |
-----------------
|id |father|son |
 ----------------
|1  |  1   |  2 |
 ----------------
|2  |  2   |  3 |
-----------------
|3  |  2   |  4 |
-----------------

我的问题是:如何确定链接“添加许多项目”的层次结构以构建相对的面包屑?我必须确定从最后一个元素(“添加很多项目”)开始的层次结构,这是我仅有的数据。

是否有一个查询或JPA方法(我正在使用Spring MVC和Hibernate),它使我能够知道所有Voci确定链接“添加许多项目”层次结构记录。

我希望清楚。

谢谢

一个更好的奥利弗

我建议使用闭合表模式。除了父ID和子ID,关闭表还包含一depth列。对于每个深度,将添加层次结构中的所有项目。

|parent|child|depth 
|1     |1    |0 
|1     |2    |1
|1     |3    |2
|1     |4    |3

|2     |2    |0 
|2     |3    |1
|2     |4    |2

|3     |3    |0 
|3     |4    |1

|4     |4    |0

现在唯一要做的就是查询子菜单为所选菜单的所有条目并按深度排序:

select parent from Voci where child = 4 order by depth

returns 4,3,2,1

-> select * from Voce where id in (select parent from Voci where child = 4 order by depth)
   or a correspondent JPA Query

还有其他几种用于存储层次结构的模式。一些数据库支持(特定于供应商的)递归查询,但是简单父ID的使用(而Voci本质上没有其他用途)被认为是反模式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章