3

私は次のようなものを実装しようとしています:

SELECT c.*, asCount.assetCount
FROM Company c
LEFT JOIN (
    SELECT company_id, COUNT(*) as assetCount 
    FROM Asset 
    GROUP BY company_id) asCount
ON c.id = asCount.company_id

質問: JPA 2 Criteria でこれを実装するにはどうすればよいですか?

asCount の結果を個別に取得できますが、Company に結合する方法がわかりません

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = builder.createTupleQuery();
Root<Asset> asset = cq.from(Asset.class);
cq.multiselect(asset.<Company>get("company").<Long>get("id").alias("id"), builder.count(asset).alias("assetCount"));
cq.groupBy( asset.<Company>get("company").<Long>get("id") );

Query query = em.createQuery(cq);
List<Tuple> results = query.getResultList();

前もって感謝します。

PS
1. Hibernate API を使用して子の数を尋ねる同様のスレッドがあります: Hibernate children count criteria
2. トピックを説明する別の有用なスレッド: JPA CriteriaBuilder - 1 対多の関係で関連付けられたエンティティの数で並べ替える

4

1 に答える 1

4

さて、私は自分で解決策を見つけました。それが他の誰かに役立つことを願っています:)

CriteriaQuery<Tuple> cq = builder.createTupleQuery();
Root<Company> company = cq.from(Company.class);
Join<Company, Asset> secondTable = company.join("assets", JoinType.LEFT);
cq.multiselect(company.<String>get("id").alias("id"), builder.count(secondTable).alias("assetCount"));
cq.groupBy( company.<Long>get("id") );

Query query = em.createQuery(cq);
List<Tuple> results = query.getResultList();
于 2013-02-27T12:30:19.840 に答える