JPA 2标准中From子句中的子查询

时间:2012-07-20 05:52:51

标签: jpa-2.0 criteria-api querydsl

我有一个数据模型,帐户可以有多个用户:

class Account {
    Long id;
}
class User {
    Long id;
    @ManyToOne
    Account account;
}

我想执行以下查询,该查询显示每个帐户的用户数:

select Account.id, NumUsers.num from Account, 
       (select Account.id as account_id, count(User.id) as num 
        from User join Account on User.account_id=Account.id 
        group by Account.id) as NumUsers 
where Account.id=NumUsers.account_id;

我知道我可以将此特定查询重写为:

select Account.id, count(User.id) from Account join 
       User on User.account_id=Account.id group by Account.id

但我计划为需要多个组的报告创建更复杂的查询。我阅读here关于多个群组的正确方法。

如何使用JPA2 Criteria API创建查询?

1 个答案:

答案 0 :(得分:6)

您不能在FROM子句中使用子查询和JPA 2 Criteria API。它确实具有与JPQL相同的限制。在JPA 2规范中,关于JPQL中的子查询如下:

  

子查询可以在WHERE或HAVING子句中使用。

关于Criteria API中关于子查询的说法得出了相同的结论:

  

可以使用相关和非相关子查询   限制谓词。子查询是通过构造的   创建和修改子查询对象。

     

子查询实例可以作为参数传递给all,any或   CriteriaBuilder接口的一些方法用于条件   表达式。

     

可以将子查询实例传递给CriteriaBuilder存在方法   创建一个条件谓词。