我有一个系统来确定菜单链接层次结构并构建面包屑。我有 2 个表:Voce
和 Voci
。
Voce
既是菜单链接名又是页面标题名。 Voci
表示Voci
的层次结构。每个Voce
都可以有另一个Voce
作为son(这里看不到相关代码,反正我是用JPA 把一个Voce 绑定(bind)到很多Voci 上)。例如,这是页面/链接“添加多个项目”的层次结构:菜单 --> 管理菜单 --> 添加多个项目。
----------
| |
| \/ 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 本质上没有别的)被认为是一种反模式。
关于java - 如何使用 SQL 或 JPA 确定记录的层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34591472/