java - 查询hibernate中向经理汇报的总人数

标签 java hibernate jpa jpa-2.0 hibernate-mapping

我正在研究面试中常见的问题。 请获取经理信息,即经理的 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/

相关文章:

java - Web 服务请求所需的 Java 类是什么数据类型?

java - 如何在hibernate中映射外键关系

jpa - 如何在 ormlite 中使用 JPA 注释?

jpa - 函数式运算符导致 JPA 崩溃? (漏洞?)

java - 如何使用伊利诺伊州分词器以句子作为输入?

java - 如何从 json google place api 检索 "locality"

下课后出现 "$1"的 java.io.NotSerializableException

java - Spring JPA - 枚举中枚举字段的默认值

java - 您建议如何过滤包含在巨大列表中定义的冒犯性词语的评论

java - EJB3 映射的?谁拥有 OR 映射?