【发布时间】:2020-08-26 03:23:59
【问题描述】:
我正在研究面试中常见的问题。 请获取经理信息,即经理的身份证、姓名和向他汇报的员工总数。
只有一张桌子
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”表映射。从上表可以看出,employee 表也保存了 manager 的信息,因为 manager 也是员工。所以列'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 Query 来解决与我在普通 SQL 查询中所做的相同的问题吗?
我使用 Oracle 作为数据库。
【问题讨论】:
标签: java hibernate jpa jpa-2.0 hibernate-mapping