JPA命名查询按字段排序,如果不为空

时间:2017-05-10 08:24:23

标签: jpa

我有一张表,具有自引用的父子关系,如下所示

----------------------------------------
| 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

谢谢..

1 个答案:

答案 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)。