【发布时间】:2011-02-21 12:31:26
【问题描述】:
我有一个讨厌的查询,它连接了三个不同的查询。我认为没有任何 Hibernate 方式来处理联合(我们使用的是 Hibernate 3.0.5),因此该语句被编写为 SQLQuery。
我们想要单个语句而不是使用 3 个单独的 HQL 语句的原因,以便我们可以使用 Hibernate Criteria 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)
);
【问题讨论】: