如何编写JPQL查询,从返回第一个表中的全部记录的两个表中选择数据

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (248)

我正在处理一个带有JPA的Spring-Boot应用程序和Postgres中的数据库。

当前的目标是从一个表中检索条目以及从另一个表中获取一些汇总的统计信息。

在传统的SQL中,我将使用语句LEFT JOIN(子查询),如下所示:

SELECT d.*, stats.avg_salary
FROM departments d
LEFT JOIN
  (SELECT e.dep_id, avg(e.salary) AS avg_salary
  FROM employees e
  GROUP BY e.dep_id) stats
ON (d.id = stats.dep_id)

现在我需要类似JPQL的东西。

重点是检索所有部门,包括员工工资为NULL或者根本没有员工的部门。

到目前为止我创建的查询(见下文)只返回匹配的部门(它的工作方式类似于INNER JOIN),但是我还需要包含NULL平均工资的条目。

@Query("SELECT d, avg(e.salary) "
  +"FROM Department d, Employee e "
  +"WHERE (e.department = d) "
  +"GROUP BY d")
public List<Tuple> getDepartmentsStats();

在JPQL中编写此类查询的最优雅方式是什么?

提问于
用户回答回答于

你可以使用像。这样的本机查询

  @Query(value =
    "SELECT d.name, stats.avg_salary " + 
    "FROM department d " + 
    "LEFT JOIN " + 
    "  (SELECT e.department_id, avg(e.salary) AS avg_salary " + 
    "  FROM employee e " + 
    "  GROUP BY e.department_id) stats " + 
    "ON (d.id = stats.department_id)", nativeQuery = true
    )
  public List<Tuple> getNativeDepartmentsStats();

如果DepartmentEmployee喜欢有密切的关系

@Entity
class Department {
  @Id @GeneratedValue
  Long id;
  String name;
  @OneToMany(fetch = FetchType.EAGER, mappedBy = "department")
  Set<Employee> employees;
...

那么你可以使用纯粹的JPQL

  @Query("SELECT d , avg(e.salary) FROM Department d left join d.employees e GROUP BY d")
  public List<Tuple> getFullDepartmentsStats();

扫码关注云+社区

领取腾讯云代金券