2012-07-27 95 views
0

我在寫一個J2EE/JPA/Spring 3應用程序,試圖保持純JPA 2.0。我想獲得一些子對象的數量而不必加載它們,因爲它顯然是一個昂貴的操作。比如這裏有一個簡單的例子JPA:如何在不加載懶加載集的情況下計算子記錄

Organisation 
- OrgID 
- OrgName 

Employee 
- EmployeeID 
- OrgID (key to Organisation table) 
- EmployeeName 

在JSP頁面中我想告訴所有組織的名單和員工數量,而無需加載員工自己的計數。如果它可以是加載所有組織對象的單個數據庫命中並以某種方式加載一個很好的Employee對象的計數。我寧願避免一個查詢來列出組織,然後爲每個組織計算一個員工。我想我可以添加一個瞬態屬性來保持計數,我不知道如何最好地做到這一點。

只是爲了給出一個規模的想法,將有大約50個組織,每個組織將有0到500名員工。我寧願避免任何實現特定的擴展,因爲我已經更改了JPA提供程序一次,並可能再次更改。

在SQL中,我只是做一個連接,組和計數,但我沒有線索如何在JPA中做到這一點。任何幫助感謝!

+0

使用JPA,您可以執行連接,組和計數。學習一些好的教程,然後嘗試並最終回來,如果你有一個特定的問題 – perissf 2012-07-27 06:27:59

+0

如果你可以指向我一個最有用的資源。我通過Google搜索瞭解了JPA,並且沒有簡單的問題出現 - 我試過了。我相信這並不難,我只需要一個起點。部分原因是,如果我執行了查詢,我不知道在哪裏存儲計數以及如何將其存入jsp。 – Tim 2012-07-27 06:41:53

+0

我建議從JPQL開始[本教程](http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html)和[本文](http://www.ibm。 com/developerworks/java/library/j-typesafejpa /)條件查詢 – perissf 2012-07-27 07:35:12

回答

3

您可以直接選擇您定義的對象作爲持有組織和計數的結果。然後您只需編寫查詢。唯一的竅門就是你必須按組織的每個字段手動分組。 'GROUP BY ORGANIZATION'不合法。

public class OrgWithEmpCount { 
    private Organisation org; 
    private Long empCount; 
    public OrgWithEmpCount(Organisation org, Long empCount) { 
    this.org = org; 
    this.empCount = empCount; 
    } 
} 


Select new full.package.OrgWithEmpCount(o, count(e.employeeId)) 
from Organisation o, IN(o.employees) e 
group by o.orgId, o.orgName, o.whateverElse 
+0

這意味着您需要爲網頁製作dto,這對我來說似乎不夠流暢。我明天會看看它,試試看,謝謝。 – Tim 2012-07-27 08:29:04

+0

你不需要*創建對象,你可以選擇結果,休眠會給你一個'List ',然後你將自己分離到組織中並計數。猜猜這是個人喜好哪一個更好:) – Affe 2012-07-27 17:08:40

+0

我不一定使用hibernate,因爲我說純JPA。今天晚些時候,我會在有空的時候嘗試一下,謝謝。 – Tim 2012-07-27 21:14:09

1

從情緒中接受的答案開始 - 除了您希望計算公司即使沒有員工的情況,這種方法也行得通。 IN查詢最終將排除這些公司。很難想象一個公司員工爲零,而對於查詢舉例起見,你可以做這樣的:

select new full.package.OrgWithEmpCount(o, count(e.employeeId)) 
FROM Organisation o LEFT JOIN e.employees AS e 
group by o.orgId, o.orgName, o.whateverElse 

你的想法......只是,而不是做一個IN,做一個LEFT JOIN 。

相關問題