
大多数时候,当我们使用 JPA 查询时,获得的结果会映射到对象/特定数据类型。但是当我们在查询中使用聚合函数时,处理结果有时需要我们自定义 JPA 查询。
让我们通过一个例子来理解(部门,员工)−
Dept.java
1 2 3 4 5 6 7 8 9 10 | @Entity
public class Dept {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "dep" )
private List<Employee> emp;
}
|
登录后复制
一个部门可以有一名或多名员工,但一名员工只能属于一个部门。
员工.java
1 2 3 4 5 6 7 8 9 10 11 | @Entity
public class Employee {
@Id
private Long id;
private Integer joiningyear;
@ManyToOne
private Dept dep;
}
|
登录后复制
现在,如果我们想获取入职日期以及按入职日期分组的员工人数,
1 2 3 4 5 6 | @Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Query( "SELECT e.joiningyear, COUNT(e.joiningyear) FROM Employee AS e GROUP BY e.joiningyear" )
List<Object[]> countEmployeesByJoiningYear();
}
|
登录后复制
上述查询可以正常工作,但是以List
CountEmployees.java
的中文翻译为:
CountEmployees.java
1 2 3 4 5 6 7 8 9 10 11 12 | package com.tutorialspoint;
public class CountEmployees {
private Integer joinyear;
private Long totalEmp;
public CountEmployees(Integer joinyear, Long totalEmp) {
this.joinyear = joinyear;
this.totalEmp = totalEmp;
}
}
|
登录后复制
现在,我们可以自定义我们的JPA查询,如下所示−
1 2 | @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 类。
以上是如何使用聚合函数自定义JPA查询的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!