我正在研究面试中常见的问题。 请获取经理信息,即经理的 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_Division”表映射。从上表中您将看到员工表也保存了经理的信息,因为经理也是员工。因此列“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;
在我的 EmployeeDAOImpl.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 作为数据库。
最佳答案
Hql 不支持 from
子句中的子查询。 https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch16.html#queryhql-subqueries
注意这句话:
Note that HQL subqueries can occur only in the select or where clauses.
为什么不直接使用这个不带子查询的查询:
select manager.emp_id, manager.emp_name, count(*) as TOTAL_JUNIORS
from GS_EMPLOYEE manager
inner join GS_EMPLOYEE employee on manager.emp_id = employee.manager_id
where manager.manager_id = manager.emp_id
group by emp_id, emp_name;
关于java - 查询hibernate中向经理汇报的总人数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61715261/