【问题标题】:Subquery in From claus in JPA2 CriteriaJPA 2 Criteria 中 From 子句中的子查询
【发布时间】:2012-07-19 09:22:02
【问题描述】:

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

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 创建查询?

【问题讨论】:

    标签: jpa-2.0 criteria-api querydsl


    【解决方案1】:

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

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

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

    相关子查询和非相关子查询均可用于 限制谓词。子查询是通过 创建和修改子查询对象。

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

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

    【讨论】:

    • 为什么这是 JPQL 的限制?有办法解决吗?
    • 很难说,应该问设计它的人。至少它使语言的构建实现更容易。唯一的办法是在 FROM 子句中编写不带子查询的查询。
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2015-06-26
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多