【问题标题】:How to determine the hierarchy of a record with SQL or JPA如何使用 SQL 或 JPA 确定记录的层次结构
【发布时间】:2016-04-08 02:01:55
【问题描述】:

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

我希望清楚。

谢谢

【问题讨论】:

  • 你用的是什么数据库?在 Oracle 数据库中,CONNECT BY PRIOR 语句可以帮助您。否则,您将在 Java/JPA 中获取父亲,然后是父亲的父亲,依此类推,直到父亲为空(或根)。

标签: java sql hibernate spring-mvc jpa


【解决方案1】:

我建议使用闭包表模式。除了父 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 基本上没有别的)被视为反模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多