java查询hibernate中向manager报告的总人数
我正在研究一个采访中常见的问题。 请获取经理信息,即经理id、姓名和向其汇报的员工总数
只有一张桌子
GS_Employee
其内容如下:
-- Creation of Employeee table
create table GS_EMPLOYEE(
emp_id number(3) primary key,
emp_name varchar2(100),
division_id number (3) references GS_DIVISION,
manager_id number(3) references GS_EMPLOYEE
)
请忽略“GS_部门”表映射。从上表中,您将看到employee表也包含经理的信息,因为经理也是一名员工。所以列“manager_id”引用的是同一个表
manager_id number(3) references GS_EMPLOYEE
如果我编写一个简单的SQL查询,自连接会给出如下所示的结果
select em.emp_id,
em.emp_name,
mgr.TOTAL_JUNIORS
from GS_EMPLOYEE em,
(select e2.emp_id as EMPLOYEE_ID,
count(e1.emp_id) as TOTAL_JUNIORS
from GS_EMPLOYEE e1,
GS_EMPLOYEE e2
where e1.manager_Id = e2.emp_id
group by (e2.emp_id)
) mgr
where em.emp_id = mgr.EMPLOYEE_ID;
但是,我需要使用Hibernate来解决上述问题
因此我创造了一个实体
@Entity
@Table(name="GS_EMPLOYEE")
@NamedQuery(name="getAllEmployeesQuery",query ="from Employee e order by e.employeeId asc")
public class Employee implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1035435388896L;
@Id
@Column(name="EMP_ID")
private Integer employeeId;
@Column(name="EMP_NAME")
private String employeeName;
@ManyToOne(fetch=FetchType.LAZY,targetEntity=Division.class)
@JoinColumn(name="DIVISION_ID")
private Division division;
@ManyToOne(fetch=FetchType.LAZY,targetEntity=Employee.class)
@JoinColumn(name="MANAGER_ID")
private Employee manager;
@OneToMany(fetch = FetchType.LAZY,targetEntity=Employee.class,mappedBy="manager",cascade= {CascadeType.ALL},orphanRemoval=false)
private Set<Employee> employeeList;
在我的雇员中。java类我已经编写了这个方法
public List<Employee> getManagerAndJuniors() throws Exception{
Session session = this.sessionFactory.getCurrentSession();
Query<Employee> q = session.getNamedQuery("getAllEmployeesQuery");
List<Employee> list = q.list();
return list;
}
上述方法获取所有员工
现在在服务层,即EmployeeServiceImpl。java我做过滤
public List<Employee> getManagerAndJuniors() throws Exception{
List<Employee> managerList = this.dao.getManagerAndJuniors();
List<Employee> list = new ArrayList<Employee>();
managerList.forEach((Employee mgr) -> {
Set<Employee> empList = null;
try {
empList = mgr.getEmployeeList();
if(empList != null && empList.size() > 0) {
list.add(mgr);
}
}catch(Exception e) {
System.out.println(e.getMessage());
}
});
return list;
}
现在,我可以过滤所有经理,并将其添加到新列表中,然后返回
我可以做一些JPQL或Hibernate查询来解决与普通SQL查询相同的问题吗
我使用Oracle作为数据库
# 1 楼答案
Hql不支持
from
子句中的子查询https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch16.html#queryhql-subqueries注意这句话:
为什么不直接使用这个查询而不使用子查询: