2012-07-27 97 views
0

我在写一个J2EE/JPA/Spring 3应用程序,试图保持纯JPA 2.0。我想获得一些子对象的数量而不必加载它们,因为它显然是一个昂贵的操作。比如这里有一个简单的例子JPA:如何在不加载懒加载集的情况下计算子记录

Organisation 
- OrgID 
- OrgName 

Employee 
- EmployeeID 
- OrgID (key to Organisation table) 
- EmployeeName 

在JSP页面中我想告诉所有组织的名单和员工数量,而无需加载员工自己的计数。如果它可以是加载所有组织对象的单个数据库命中并以某种方式加载一个很好的Employee对象的计数。我宁愿避免一个查询来列出组织,然后为每个组织计算一个员工。我想我可以添加一个瞬态属性来保持计数,我不知道如何最好地做到这一点。

只是为了给出一个规模的想法,将有大约50个组织,每个组织将有0到500名员工。我宁愿避免任何实现特定的扩展,因为我已经更改了JPA提供程序一次,并可能再次更改。

在SQL中,我只是做一个连接,组和计数,但我没有线索如何在JPA中做到这一点。任何帮助感谢!

+0

使用JPA,您可以执行连接,组和计数。学习一些好的教程,然后尝试并最终回来,如果你有一个特定的问题 – perissf 2012-07-27 06:27:59

+0

如果你可以指向我一个最有用的资源。我通过Google搜索了解了JPA,并且没有简单的问题出现 - 我试过了。我相信这并不难,我只需要一个起点。部分原因是,如果我执行了查询,我不知道在哪里存储计数以及如何将其存入jsp。 – Tim 2012-07-27 06:41:53

+0

我建议从JPQL开始[本教程](http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html)和[本文](http://www.ibm。 com/developerworks/java/library/j-typesafejpa /)条件查询 – perissf 2012-07-27 07:35:12

回答

3

您可以直接选择您定义的对象作为持有组织和计数的结果。然后您只需编写查询。唯一的窍门就是你必须按组织的每个字段手动分组。 'GROUP BY ORGANIZATION'不合法。

public class OrgWithEmpCount { 
    private Organisation org; 
    private Long empCount; 
    public OrgWithEmpCount(Organisation org, Long empCount) { 
    this.org = org; 
    this.empCount = empCount; 
    } 
} 


Select new full.package.OrgWithEmpCount(o, count(e.employeeId)) 
from Organisation o, IN(o.employees) e 
group by o.orgId, o.orgName, o.whateverElse 
+0

这意味着您需要为网页制作dto,这对我来说似乎不够流畅。我明天会看看它,试试看,谢谢。 – Tim 2012-07-27 08:29:04

+0

你不需要*创建对象,你可以选择结果,休眠会给你一个'List ',然后你将自己分离到组织中并计数。猜猜这是个人喜好哪一个更好:) – Affe 2012-07-27 17:08:40

+0

我不一定使用hibernate,因为我说纯JPA。今天晚些时候,我会在有空的时候尝试一下,谢谢。 – Tim 2012-07-27 21:14:09

1

从情绪中接受的答案开始 - 除了您希望计算公司即使没有员工的情况,这种方法也行得通。 IN查询最终将排除这些公司。很难想象一个公司员工为零,而对于查询举例起见,你可以做这样的:

select new full.package.OrgWithEmpCount(o, count(e.employeeId)) 
FROM Organisation o LEFT JOIN e.employees AS e 
group by o.orgId, o.orgName, o.whateverElse 

你的想法......只是,而不是做一个IN,做一个LEFT JOIN 。

相关问题