3

J2EE/JPA/Spring 3 アプリケーションを作成し、純粋な JPA 2.0 を維持しようとしています。明らかに高価な操作であるため、子オブジェクトをロードせずにカウントを取得したいと考えています。たとえば、ここに単純化された例があります

Organisation
 - OrgID
 - OrgName

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

jsp ページで、すべての組織のリストと、従業員自身を読み込まずに従業員数を表示したいと考えています。すべての Organization オブジェクトをロードし、何らかの形で Employee オブジェクトのカウントをロードする単一のデータベース ヒットである場合、それは素晴らしいことです。組織を一覧表示するためのクエリを 1 つ避け、組織ごとに 1 つのクエリを使用して従業員をカウントすることは避けたいと思います。カウントを保持するために一時的なプロパティを追加できると思いますが、それを行う最善の方法がわかりません。

規模の目安としては、約 50 の組織があり、各組織には 0 ~ 500 人の従業員がいます。JPAプロバイダーを一度変更したことがあり、再び変更される可能性があるため、実装固有の拡張機能は避けたいと思います。

SQL では結合、グループ化、およびカウントを行うだけですが、JPA でそれを行う方法がわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

4

組織とカウントを保持する結果となるように定義したオブジェクトを直接選択できます。あとはクエリを書くだけです。唯一の秘訣は、組織のすべてのフィールドで手動でグループ化する必要があることです。「GROUP BY ORGANISATION」は合法ではありません。

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
于 2012-07-27T06:54:01.700 に答える
2

Affeからの受け入れられた回答から外れる-従業員がいない場合でも企業の数を数えたい場合を除いて、これはうまくいきました。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 を実行します。

于 2013-04-05T14:40:22.337 に答える