如何在JPQL

时间:2018-02-19 14:03:44

标签: java spring jpa jpql

我在春天为一个大学项目工作。我必须开发一个允许用户创建"会议的系统。 我已经映射了User和Rendezvous(Meeting)之间的关系,如下所示:

用户(1)< ---(0 ... *) Rendezvous

@Entity
@Access(AccessType.PROPERTY)
public class Rendezvous extends DomainEntity {

private User                        user;


@NotNull
@Valid
@ManyToOne(optional = false)
public User getUser() {
    return this.user;
}

public void setUser(final User user) {
    this.user = user;
}

}

我需要知道每个用户创建的rendezvouses的平均值和标准差,因此我尝试创建一个查询来执行此操作。

我需要在mySQL中对这一个进行等效查询,但是在JPQL中

    select avg(rendezvouses) from (
       select user_id, count(*) as rendezvouses 
          from rendezvous group by user_id
    ) nestedQuery;

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要获得所有用户的平均集合点以及每个用户的集合点数。

根据JSR-338 - Java Persistence 2.1中定义的JPA 2.1规范,JPQL AVG函数的参数必须是数字。

此外,您将无法在JPQL中引用子查询(没有/ exists构造AFAIK)。

因此,您应创建一个查询以获取集合点的总数

select count(r.id) from rendezvous r

然后除以用户数。

然后您可以获得每个用户的集合点数:

select count(r.id) from rendezvous r group by r.user.id

鉴于此,我建议使用sql查询(本机查询)而不是jpql查询。 JPA / JPQL更适合处理对象而不是精细调优的SQL查询。

例如,您可以轻松获得标准偏差:

SQL - STDEVP or STDEV and how to use it?