2013-02-27 58 views
3

JPA 2个标准API,孩子算我想实现像标准

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标准执行呢?

我能够分别获得asCount结果,但不知道如何将它加入到公司

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 - sort by the number of associated entities in a one-to-many relationship

回答

3

好吧,我已经找到了自己的解决方案。希望它可以帮助别人:)

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();