2012-11-16 57 views
1

任何人都可以幫我翻譯HQL以下SQL查詢用於獲取分頁結果嗎?HQL等價於SQL分頁查詢

SELECT * 
FROM REPORDER repairorde0x_ 
INNER JOIN REPREPAIRDEVICE repairdevi1x_ 
ON repairorde0x_.ID=repairdevi1x_.REPORDERID 
WHERE repairorde0x_.ID IN 
    (SELECT id 
    FROM 
     (SELECT row_.id, 
     rownum rownum_ 
     FROM 
      (SELECT DISTINCT repairorde0_.ID 
      FROM REPORDER repairorde0_ 
      INNER JOIN REPREPAIRDEVICE repairdevi1_ 
      ON repairorde0_.ID=repairdevi1_.REPORDERID 
     ) row_ 
     WHERE rownum <= 550 
     ) 
    WHERE rownum_ > 500 
    ) ; 

我不能轉換到HQL的部分是選擇要獲取修理訂單的ID的子選擇。 我不知道在這種情況下如何處理rownum和幾個後續的子選擇語句。

我需要HQL查詢才能在數據庫級別進行分頁,而不是在Java內存中進行分頁。 (Query.setMaxResults,Query.setFirstResult用於連接抓取HQL問題查詢警告:「FIRSTRESULT /與收集指定的maxResults取;應用在內存中!」)

只給一個提示在實體上的Java模型:

class RepairOrder{ 
    private int id; 
    private String orderNumber; 
    private List<RepairDevice> repairDevices; 
} 

class RepairDevice{ 
    private int id; 
    private int repairOrderId; 
    private String deviceName; 
} 
+0

如果不知道類模型,就不能編寫HQL。 –

+1

您應該將問題簡化爲您正在努力的部分(例如,子查詢中的rownum)。這個問題可能會被視爲「過於本地化」。無論如何,回答短問題的機會更大。不是每個人都有很多時間閱讀/理解冗長複雜的問題。 –

+0

@StefanSteinegger我修改了SQL語句並添加了有關Java實體對象模型的信息。我認爲這個問題現在更具可讀性。 –

回答

2

這將是最簡單的只是頁修復訂單和加載具有附加查詢的裝置中,使用批量大小,以避免N + 1:

orders = session 
    .CreateQuery("from RepairOrder") 
    .SetFirstResult(500) 
    .SetMaxResult(50); 

這個XML映射將加載裝置50順序(1 + N a 1+(N/50))。

<bag name="RepairDevices" batch-size="50" ... 
+0

爲了簡化示例,我只添加了一個JOIN,但實際上有3個連接表,所以我猜上面提到的解決方案實際上並不適合我的情況。 –

+1

我認爲它仍然有效。你不能(不應該)加入所有這3個表,因爲它們都會使結果,只獲得(分頁)主對象和批量加載引用對象(懶惰地)會好得多。 –