【问题标题】:Query for total number of people reporting to manager in hibernate查询休眠状态下向经理汇报的总人数
【发布时间】: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


    【解决方案1】:

    Hql 不支持 from 子句中的子查询。 https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch16.html#queryhql-subqueries

    注意句子:

    请注意,HQL 子查询只能出现在 select 或 where 子句中。

    你为什么不直接使用这个不带子查询的查询:

    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;
    

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 2012-12-30
      • 2019-03-28
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      相关资源
      最近更新 更多