gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:34:41 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com