У меня неприятный запрос, который объединяет три разных запроса. Я не думаю, что есть какой-либо способ обработки профсоюзов в Hibernate (мы используем Hibernate 3.0.5), поэтому утверждение написано как SQLQuery.
Причина, по которой нам нужен один оператор, а не 3 отдельных оператора HQL, чтобы мы могли использовать Критерии гибернации setFirstResult и setMaxResults.
Выбор только определенных полей не обязателен, поэтому выбор f. * И т. Д. Будет приемлемым, если это облегчит задачу (хотя мне пришлось бы создавать псевдонимы для каждого столбца, чтобы избежать дублирования имен столбцов).
SELECT * FROM (
SELECT f.id as foo_id,
f.name as foo_name,
NVL(b2.name, ' ') as baz_name,
NVL(b1.name, ' ') as bar_name,
NVL(b1.alias, ' ') as bar_alias,
NVL(b1.description, ' ') as bar_description
FROM foo f
LEFT JOIN bar b1 ON f.id = b1.foo_id
LEFT JOIN baz b2 ON f.id = b2.foo_id AND b1.baz_id = b2.id
UNION
SELECT f.id as foo_id,
f.name as foo_name,
NVL(b2.name, ' ') as baz_name,
NVL(b1.name, ' ') as bar_name,
NVL(b1.alias, ' ') as bar_alias,
NVL(b1.description, ' ') as bar_description
FROM foo f
LEFT JOIN baz b2 ON f.id = b2.foo_id
LEFT JOIN bar b1 ON b2.id = b1.baz_id
WHERE b1.id IN (select b1b.id from bar b1b where b1b.foo_id = f.id)
UNION
SELECT f.id as foo_id,
f.name as foo_name,
NVL(b2.name, ' ') as baz_name,
NVL(b1.name, ' ') as bar_name,
NVL(b1.alias, ' ') as bar_alias,
NVL(b1.description, ' ') as bar_description
FROM foo f
LEFT JOIN baz b2 ON f.id = b2.foo_id
LEFT JOIN bar b1 ON b2.id = b1.baz_id
WHERE b2.id IN (select b22.id from baz b22 where b22.foo_id = f.id)
);