出于性能原因,应将平均计算委托给数据库。 避免
CompanyDAO.getAll()自己计算平均值。这样做可能会导致N +
1个选择问题,你当
LAZY装车选择。
使用此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实体类型,如下所示:
@Entitypublic 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注释。



