📅  最后修改于: 2023-12-03 15:05:16.185000             🧑  作者: Mango
在使用Spring JPA时,我们经常要进行聚合查询(如求和、平均数、最大/最小值等),这时就需要用到Group By关键字。本文将介绍使用Spring JPA进行Group By查询的方法。
我们假设有一个实体类Employee
,其中包含name
、age
和salary
三个属性,分别表示员工的姓名、年龄和工资。
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
private double salary;
// 省略getter/setter方法和其他属性
}
接着,在使用Spring JPA进行数据库操作之前,我们需要创建一个继承自JpaRepository
接口的Repository接口,用于定义我们需要的各种数据库操作方法。
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
List<Employee> findByAgeGreaterThan(int age);
List<Employee> findBySalaryGreaterThan(double salary);
List<Employee> findByAgeGreaterThanAndSalaryGreaterThan(int age, double salary);
@Query("SELECT name, AVG(salary) FROM Employee GROUP BY name")
List<Object[]> findAverageSalaryByName();
// 省略其他操作方法
}
在上面的Repository接口中,我们定义了若干种查询方法,包括按年龄查询、按工资查询、按年龄和工资同时查询等。其中,重点是findAverageSalaryByName
方法,它使用了注解@Query
,并在SQL语句中使用了GROUP BY
关键字。这个方法的作用是,根据员工姓名分组,并返回每个分组的平均工资。
最后,我们再创建一个控制器类用于处理业务逻辑。
@RestController
public class EmployeeController {
@Autowired
private EmployeeRepository employeeRepository;
@GetMapping("/employees/avg-salary-by-name")
public List<Map<String, Object>> findAverageSalaryByName() {
List<Object[]> list = employeeRepository.findAverageSalaryByName();
List<Map<String, Object>> result = new ArrayList<>();
for (Object[] arr : list) {
Map<String, Object> map = new HashMap<>();
map.put("name", arr[0]);
map.put("averageSalary", arr[1]);
result.add(map);
}
return result;
}
// 省略其他控制器方法
}
在上面的控制器中,我们使用@Autowired
注解注入了EmployeeRepository
,并使用了GetMapping
注解,定义了一个URL路径,并调用了findAverageSalaryByName
方法。
最后,我们简单说明一下findAverageSalaryByName
方法的实现逻辑。首先,它调用了employeeRepository.findAverageSalaryByName()
方法,得到一个包含若干个Object
数组的列表。每个数组的第一个元素是员工的姓名,第二个元素是该员工的平均工资。接着,我们将这个列表转换为一个包含多个Map
的列表,每个Map
将员工姓名和平均工资映射为一个键值对,并将这个列表作为结果返回给前端。
通过上面的步骤,我们成功地使用Spring JPA进行了Group By查询,并实现了一个简单的查询接口。当然,Spring JPA远不止这些功能,我们还可以使用它进行各种复杂的数据库操作。如果你还没有学习Spring JPA,可以参考相关的教程文档。