📜  spring jpa group by 查询方法 - Java (1)

📅  最后修改于: 2023-12-03 15:05:16.185000             🧑  作者: Mango

Spring JPA Group By 查询方法

在使用Spring JPA时,我们经常要进行聚合查询(如求和、平均数、最大/最小值等),这时就需要用到Group By关键字。本文将介绍使用Spring JPA进行Group By查询的方法。

实体类

我们假设有一个实体类Employee,其中包含nameagesalary三个属性,分别表示员工的姓名、年龄和工资。

@Entity
public class Employee {
  
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id;

  private String name;

  private int age;

  private double salary;

  // 省略getter/setter方法和其他属性
}
创建Repository

接着,在使用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,可以参考相关的教程文档。