HQL - Включить результаты, когда количество равно 0 - PullRequest
0 голосов
/ 26 мая 2020

У меня есть следующая схема базы данных (по крайней мере, ее подмножество).

|------------------------------------------------------------|
|  Tbl_1                                                     |
|-------|--------------|-----------|------------|------------|
|  id   |   aId        | typeId    |  aName     |  aCurr     |
|-------|--------------|-----------|------------|------------|
|  1    |         1    | 1         | n_1        |  2         |
|  2    |         2    | 1         | n_1        |  1         |
|-------|--------------|-----------|------------|------------|

|---------------------------------|
|  Tbl_2                          |
|----------|-------------|--------|
|  id      |  typeId     |typeName|
|----------|-------------|--------|
|  1       |  1          |type_1  |
|  2       |  2          |type_2  |
|----------|-------------|--------|

|------------------------|
|  Tbl_3                 |
|----------|-------------|
|  aId     |  pId        |
|----------|-------------|
|  1       |  1          |
|  2       |  1          |
|----------|-------------|

Я пытаюсь создать REST API, который будет возвращать количество идентификаторов aIds из таблицы 1 на основе typeIds. В частности, ожидаемый JSON должен выглядеть так:

[
    {
        "typeName": "type_1",
        "aName": "n_1",
        "total": 2
    },
    {
        "typeName": "type_2",
        "aName": "n_2",
        "total": 0
    }
]

Однако каждый раз, когда я запускаю следующий запрос (в Hibernate), он возвращает только первый JSON Object (type_1) и игнорирует тот, у которого счетчик 0.

SELECT new GroupByType(tb2.typeName, tb1.aName, coalesce(COUNT(tb2.typeId)),0)
FROM Tbl_1 tb1
INNER JOIN Tbl_3 tb3 ON t1.aId=t3.aId
LEFT JOIN Tbl_2 tb2 on tb2.typeId=tb1.typeId
WHERE tb3.pId=1
GROUP BY b2.typeName, GroupByType.class).getResultList();

Я пробовал несколько вещей, которые я читал в SO, но ничего не работает (например, измените WHERE на AND, как показано ниже)

SELECT new GroupByType(tb2.typeName, tb1.aName, coalesce(COUNT(tb2.typeId)),0)
FROM Tbl_1 tb1
INNER JOIN Tbl_3 tb3 ON t1.aId=t3.aId AND tb3.pid=1
LEFT JOIN Tbl_2 tb2 on tb2.typeId=tb1.typeId
GROUP BY b2.typeName, GroupByType.class).getResultList();

Как я понял, основная проблема здесь в том, что оператор WHERE «исключает» значения NULL, но я не могу найти для этого решения. Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...