如何使用聚合函数自定义JPA查询的结果?


大多数情况下,当我们使用JPA查询时,获得的结果会被映射到一个对象/特定的数据类型。但是,当我们在查询中使用聚合函数时,处理结果有时需要我们自定义JPA查询。

让我们通过一个例子(部门,员工)来理解这一点:

Dept.java

@Entity public class Dept { @Id private Long id; private String name; @OneToMany(mappedBy = "dep") private List<Employee> emp; //Getters //Setters }

一个部门可以拥有一个或多个员工,但一个员工只能属于一个部门。

Employee.java

@Entity public class Employee { @Id private Long id; private Integer joiningyear; @ManyToOne private Dept dep; //Getters //Setters }

现在,如果我们想获取按入职日期分组的员工入职日期和员工数量,那么:

@Repository public interface EmployeeRepository extends JpaRepository<Employee, Long> { // query methods @Query("SELECT e.joiningyear, COUNT(e.joiningyear) FROM Employee AS e GROUP BY e.joiningyear") List<Object[]> countEmployeesByJoiningYear(); }

上面的查询可以正常工作,但是这种将值存储在List<Object[]>中的方式可能会导致错误。相反,我们可以自定义JPA查询,将上述查询的结果映射到一个Java类。这个Java类只是一个简单的POJO(普通旧Java对象),不需要用@Entity注解。

CountEmployees.java

package com.tutorialspoint; public class CountEmployees { private Integer joinyear; private Long totalEmp; public CountEmployees(Integer joinyear, Long totalEmp) { this.joinyear = joinyear; this.totalEmp = totalEmp; } //Getters //Setters }

现在,我们可以自定义我们的JPA查询如下:

@Query("SELECT new com.tutorialspoint.CountEmployees(e.joiningyear, COUNT(e.joiningyear)) " + "FROM Employee AS e GROUP BY e.joiningyear")
List<CountEmployees> countEmployeesByJoining();

上述select查询的结果将被映射到CountEmployees类。通过这种方式,我们可以自定义JPA查询并将结果映射到一个Java类。

更新于:2022年8月26日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.