如何使用聚合函数自定义 JPA 查询的结果?
hibernatejavadatabase
大多数情况下,当我们使用 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();
上述选择查询的结果将映射到 CountEmployees 类。这样,我们可以自定义 JPA 查询并将结果映射到 Java 类。