【问题标题】:Is there an alternative to using UNION in this SQL statement, using Hibernate 3?使用 Hibernate 3 在此 SQL 语句中使用 UNION 是否有替代方法?
【发布时间】: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) 
);

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    过去,我通过创建数据库视图完全解决了这个问题。您可以根据问题中的 SQL 创建一个数据库视图,然后将该数据库视图简单地映射到“视图”对象。

    缺点是如果您需要以这种方式操作和保存检索到的数据,则必须根据原始数据库表读取可操作对象才能通过休眠修改和保存它们。

    【讨论】:

    • 我们考虑过一个视图,但不太喜欢那个选项。最后,我们更正了架构设计以消除对联合的需求(层次结构首先应该更直接:foo->bar->baz)。但我会接受你的回答,谢谢!
    • 您还可以使用NativeSQLQuery,它允许您在 Hibernate 上下文中使用本机 SQL 的全部功能
    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多