我有一张表,具有自引用的父子关系,如下所示
----------------------------------------
| Table: Menu |
----------------------------------------
| id | parent | name | ordinal |
----------------------------------------
| 1 | null | search | 1 |
---------------------------------------
| 2 | null | location | 2 |
----------------------------------------
| 3 | 1 | artifact | 1 |
----------------------------------------
| 4 | 2 | city | 1 |
----------------------------------------
| 5 | 2 | county | 2 |
----------------------------------------
我想首先将项目列为父母(根据他们的顺序),然后根据他们的顺序列出剩余的孩子。层次结构的部门是1.但是当我运行以下查询时,它仅列出具有父项的项目(即仅限子项);排除父母无效的父母(即根)
SELECT m FROM Menu m ORDER BY m.parent.ordinal, m.ordinal --> excludes root items
有没有办法写这样的东西:
SELECT m FROM Menu m ORDER BY IF_EXISTS(m.parent.ordinal), m.ordinal --> should include root items too
谢谢..
答案 0 :(得分:0)
您可以尝试在此使用COALESCE()
,并为父记录指定零值。这会将它们放在任何儿童记录之前。
SELECT m
FROM Menu m
ORDER BY
COALESCE(m.parent.ordinal, 0),
m.ordinal
以下是使用此逻辑的表格:
---------------------------------------------------------
| Table: Menu |
---------------------------------------------------------
| id | parent | name | ordinal | parent.ordinal |
---------------------------------------------------------
| 1 | null | search | 1 | 0 |
---------------------------------------------------------
| 2 | null | location | 2 | 0 |
---------------------------------------------------------
| 3 | 1 | artifact | 1 | 1 |
---------------------------------------------------------
| 4 | 2 | city | 1 | 2 |
---------------------------------------------------------
| 5 | 2 | county | 2 | 2 |
---------------------------------------------------------
我假设您使用的是JPA 2.0或更高版本(q.v. this SO question)。