java获取每家公司的平均工资并传递给JSP [重复]

Posted

技术标签:

【中文标题】java获取每家公司的平均工资并传递给JSP [重复]【英文标题】:java get average salary for each company and pass to JSP [duplicate] 【发布时间】:2017-06-22 17:20:48 【问题描述】:

我正在尝试获取每家公司所有员工的平均工资:

<table>
    <tr>
        <th>Company</th>
        <th>Total Number of Employees</th>
        <th>Average Salary</th>
    </tr>
<% for (Company company : companys) %>
    <tr>
        <td><%=company.getName()%></td>
        <td><%=company.getEmployees().size()%></td>
        <td><%=company.getEmployees() ???? %></td>              
    </tr>
<%  %>
</table>

我的问题:

我不知道如何计算每个公司的平均工资。有人可以帮我实现这一目标吗?

这是我的 Company.java

public class Company implements Serializable 
...
    @OneToMany(mappedBy="company", fetch=FetchType.LAZY)
    private List<Employee> employees;

...
    public List<Employee> getEmployees() 
        return this.employees;
       

在我的 controller.java 中

private void doCompanys(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException       
    List<Company> companys = CompanyDAO.getAll();
    request.setAttribute("companys", companys);
    loadJSP(urlCompanys, request, response);

在我的 CompanyDAO.java 文件中

public static List<Company> getAll() 
    EntityManager em = GestionFactory.factory.createEntityManager();
    Query q = em.createQuery("SELECT c FROM Company c");
    @SuppressWarnings("unchecked")
    List<Company> listCompany = q.getResultList();
    return listCompany;

在我的 EmployeeDAO.java 中

public static List<Employee> getAll() 
        EntityManager em = GestionFactory.factory.createEntityManager();
        Query q = em.createQuery("SELECT e FROM Employee e");
        @SuppressWarnings("unchecked")
        List<Employee> listEmployee = q.getResultList();
        return listEmployee;
    

在Employee.java中

public int getSalary() 
    return this.empSalary;

【问题讨论】:

您使用的是什么 JPA 实现?对于 Hibernate,有 @Formula 注释,请参阅:***.com/questions/2986318/… @P.Merkle jdbc eclipselink,使用 sqlite,我希望这会有所帮助。 org.eclipse.persistence.jpa.PersistenceProvider 【参考方案1】:

你可以用这个方法得到一个公司所有员工的平均工资——

public static int getAverageSalary() 
    EntityManager em = GestionFactory.factory.createEntityManager();
    Query q = em.createQuery("SELECT e FROM Employee e");
    @SuppressWarnings("unchecked")
    List<Employee> listEmployee = q.getResultList();
    // now salary specific calculations
    int sumOfSalaries = 0;
    int totalEmployee = listEmployee.size();
    for(Employee eachEmployee : listEmployee) 
        sumOfSalaries = sumOfSalaries + eachEmployee.getSalary();
    
    return sumOfSalaries/totalEmployee;

【讨论】:

这应该去哪里?在 CompanyDAO.java 中?我如何在 JSP 文件中调用它?感谢您的进一步解释【参考方案2】:

出于性能原因,应将平均值计算委托给数据库。避免调用CompanyDAO.getAll()自行计算平均值。当您选择了LAZY 加载时,这样做可能会导致n+1 selects problem。

使用此 JPQL 查询在数据库中进行平均计算:

SELECT e.company, AVG(e.salary) FROM Employee e GROUP BY e.company

更准确地说,将CompanyDAO.java 更改如下:

public static List<Company> getAll() 
    EntityManager em = GestionFactory.factory.createEntityManager();
    Query q = em.createQuery("SELECT e.company, AVG(e.salary) FROM Employee e GROUP BY e.company");

    // each list entry contains a tuple (company, avgSalary)
    List<Object[]> results = q.getResultList();

    List<Company> companiesList = new LinkedList<>();
    for (Object[] entry : results) 
        Company company = (Company) entry[0]; // contains "e.company"
        Double avgSalary = (Double) entry[1]; // contains "AVG(e.salary)"
        company.setAverageSalary(avgSalary);
        companiesList.add(company);
    

    return companiesList;

为此,请按如下方式扩展您的 Company.java 实体类型:

@Entity
public class Company implements Serializable 

    // ...

    @Transient
    private double averageSalary;

    public void setAverageSalary(double averageSalary) 
        this.averageSalary = averageSalary;
    

    public double getAverageSalary() 
        return averageSalary;
    

在您的 JSP 中,只需使用 &lt;%=company.getAverageSalary()%&gt;

请考虑这是一个需要进一步完善的草案解决方案。此解决方案适用于 EclipseLink。使用 Hibernate,您宁愿使用 @Formula 注释。

【讨论】:

非常感谢这个很棒的答案。它正在工作,只是我必须在开始时将 List getAll() 更改为 List getAll()。 我有一个与您回答的问题类似的问题。在这里***.com/questions/42057186/… 是否也可以为这个问题提供答案。已经有一个答案,但是它在 JSP 中做 java,我怎样才能为此创建方法?谢谢 很高兴我能提供帮助,感谢您指出错误的返回类型,现在已修复。

以上是关于java获取每家公司的平均工资并传递给JSP [重复]的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:Database 34.平均工资:部门与公司比较

Java:如何从第二种方法获取变量以在第三种方法中工作?

在servlet中从数据库中获取完整的行并使用bean类将它们传递给jsp

第75节:Java的中的JSP,EL和JSTL

我如何才能获得公司平均工资不到 5 年的所有员工

JAVA后台 关于如何从后台传递信息在jsp前端