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

标签 java sql hibernate spring-mvc jpa

我有一个系统来确定菜单链接层次结构并构建面包屑。我有 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/

相关文章:

java - 尝试在 Android Studio 中对空对象引用调用虚拟方法 'android.content.Context.getApplicationInfo()'

java - 如何将多个对象写入可序列化文件并在程序再次使用时读取它们?

java - Jtree 渲染器设置自定义图标不起作用

sql - 禁用主键并在 SQL 批量插入后重新启用

java - 有关如何将 Facebook 帐户的数据获取到 Java 类的演示示例?

php - 根据实体属性值查询所有对象?

mysql - 如何给出多于一个的having子句

java - Hibernate 从数据库函数生成 ID

java - 创建 WebSecurityConfiguration 中定义的名称为 'springSecurityFilterChain' 的 bean 时出错

java - 具有相同名称的私有(private)回调方法