有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    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;