Есть ли альтернатива использованию UNION в этом операторе SQL с использованием Hibernate 3? - PullRequest
0 голосов
/ 21 февраля 2011

У меня неприятный запрос, который объединяет три разных запроса. Я не думаю, что есть какой-либо способ обработки профсоюзов в 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) 
);

1 Ответ

0 голосов
/ 21 февраля 2011

В прошлом я полностью обходил эту проблему, создавая представление базы данных. Вы можете создать представление базы данных на основе SQL, который у вас есть в вашем вопросе, а затем просто отобразить это представление базы данных на «просмотр» объекта.

Недостатком является то, что если вам нужно манипулировать и сохранять полученные таким образом данные, вам придется читать манипулируемые объекты на основе исходной таблицы базы данных, чтобы изменять и сохранять их в режиме гибернации.

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