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 中,只需使用 <%=company.getAverageSalary()%>
。
请考虑这是一个需要进一步完善的草案解决方案。此解决方案适用于 EclipseLink。使用 Hibernate,您宁愿使用 @Formula
注释。
【讨论】:
非常感谢这个很棒的答案。它正在工作,只是我必须在开始时将 List以上是关于java获取每家公司的平均工资并传递给JSP [重复]的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode:Database 34.平均工资:部门与公司比较