如何使用聚合函式自定義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類。
廣告