2009-10-14 59 views
0

我有2個表:休眠的DetachedCriteria FROM子句

orders: id 
    items: id, orderId, total, flag 

我想使用Hibernate標準(DetachedCriteria之後),使下面的查詢:

SELECT 
     o.id, 
     SUM(i1.total), 
     SUM(i2.total) 
    FROM 
     orders o 
      LEFT JOIN 
      (
       SELECT 
        i.orderId as orderId, 
        SUM(i.total) as total 
       FROM 
        items i 
       WHERE 
        i.flag = 0 
       GROUP BY 
        orderId 
      ) AS i1 
      ON i1.orderId = o.id 
      LEFT JOIN 
      (
       SELECT 
       i.orderId as orderId, 
        SUM(i.total) as total 
       FROM 
        items i 
       WHERE 
        i.flag = 1 
       GROUP BY 
        orderId 
      ) AS i2 
      ON i2.orderId = o.id 
    GROUP BY 
     o.id 

我知道如何使用DetachedCriteri一個創建子查詢在WHERE子句中,但正如您所見,我需要在FROM子句中執行子查詢。如果不可能,可能有辦法將它寫入SELECT子句(在SUM()之內),因爲這個查詢可以被重寫爲這種形式。

我真的需要使用Criteria API,即使我必須將本機SQL傳遞給查詢。

我沒有向你展示類或映射,但正如你所看到的,這是一個非常簡單的例子。

+0

你沒向我們展示類或映射,但標準API進行了對象模型,而不是SQL來表達。 – skaffman

+0

是的,我已經說過了。這個例子非常簡單,我不認爲這裏需要類或映射,因爲我的問題可能無法使用Criteria API解決。 – prostynick

+0

您是否嘗試過使用此預測?添加映射和類始終有助於在發佈前檢查提示。 – zoidbeck

回答

0

我發現我的問題的解決方案。我必須做一個POJO和映射:

<class name="OrderTotal" 
    entity-name="OrderTotalForFlag0"> 
    <subselect> 
     SELECT 
      i.orderId AS id, 
      SUM(i.total) AS total 
     FROM 
      items i 
     WHERE 
      i.flag = 0 
     GROUP BY 
      id 
    </subselect> 
    <id name="id" type="int" /> 
    <property name="total" type="int" /> 
</class> 

當然,對於標誌1它將是類似的。這也可以通過在數據庫中聲明視圖併爲該視圖創建映射來完成。在這個例子中,我使用了相同的POJO類,但是使用了不同的實體名稱。

然後我做出Order類的屬性和映射:

<one-to-one name="orderTotalForFlag0" entity-name="OrderTotalForFlag0" /> 
<one-to-one name="orderTotalForFlag1" entity-name="OrderTotalForFlag1" /> 

當然懶惰可以設置。

現在我敢肯定,這可能在不同的方式也做了 - 通過使子查詢中SELECT條款 - 使用formula屬性/元素在屬性映射,但是這將在FROM條款比子查詢工作慢。

當然,所有這一切在文件到Hibernate)