У меня есть следующая схема базы данных (по крайней мере, ее подмножество).
|------------------------------------------------------------|
| 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, но я не могу найти для этого решения. Заранее спасибо!