Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:如何在不加载延迟加载集的情况下计算子记录_Java_Spring_Jakarta Ee_Jpa_Jpa 2.0 - Fatal编程技术网

Java JPA:如何在不加载延迟加载集的情况下计算子记录

Java JPA:如何在不加载延迟加载集的情况下计算子记录,java,spring,jakarta-ee,jpa,jpa-2.0,Java,Spring,Jakarta Ee,Jpa,Jpa 2.0,我正在编写一个J2EE/JPA/Spring3应用程序,试图保持纯粹的JPA2.0。我想在不加载子对象的情况下获得子对象的数量,因为这显然是一个昂贵的操作。例如,这里有一个简化的例子 Organisation - OrgID - OrgName Employee - EmployeeID - OrgID (key to Organisation table) - EmployeeName 在jsp页面上,我想显示所有组织的列表和员工数量,而不加载员工自己。如果它可以是一个单一的数据

我正在编写一个J2EE/JPA/Spring3应用程序,试图保持纯粹的JPA2.0。我想在不加载子对象的情况下获得子对象的数量,因为这显然是一个昂贵的操作。例如,这里有一个简化的例子

Organisation
 - OrgID
 - OrgName

Employee
 - EmployeeID
 - OrgID (key to Organisation table)
 - EmployeeName
在jsp页面上,我想显示所有组织的列表和员工数量,而不加载员工自己。如果它可以是一个单一的数据库点击,加载所有的组织对象,并以某种方式加载员工对象的计数,那将是伟大的。我宁愿避免一个查询来列出组织,然后每个组织一个查询来统计员工。我想我可以添加一个临时属性来保存计数,我不知道如何最好地做到这一点

就规模而言,将有大约50个组织,每个组织将有0到500名员工。我宁愿避免任何特定于实现的扩展,因为我已经更改了JPA提供者一次,并且可能再次更改


在SQL中,我只需要进行连接、分组和计数,但我不知道如何在JPA中进行。感谢您的帮助

您可以直接选择一个对象,该对象定义为保存组织和计数的结果。然后您只需编写查询。唯一的诀窍是你必须按组织中的每个领域手动分组“按组织分组”不合法

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

偏离了来自Affe的公认答案——这是有效的,除非你们想在并没有员工的情况下对公司进行统计。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

使用JPA,您可以进行连接、分组和计数。学习一些好的教程,然后试着最终回来,如果你有一个具体的问题,如果你能告诉我一个最有用的资源。我通过谷歌搜索学会了JPA,但没有简单的查询——我已经尝试过了。我相信这并不难,我只需要一个起点。部分原因是,如果我进行了查询,我不知道在哪里存储计数以及如何将计数发送到jsp。我建议从JPQL和条件查询开始,这意味着您需要为页面制作一个dto,这对我来说似乎不雅观。我明天会查看并尝试一下,谢谢。您不需要制作对象,您只需选择结果,hibernate将返回一个
列表
,然后您将自己划分为组织和计数。我猜这是个人偏好,哪一个更好:)我不一定使用hibernate,正如我所说的纯JPA。今天晚些时候我有时间的时候会尝试一下,谢谢。效果很好:)剩下的唯一一件事就是提高数据库查询的效率。假设组织通过ParentCompanyID链接到一个ParentCompany实体,现在它们被急切地加载,但这是每个组织的一个数据库查询。下面的查询给出了一个错误“查询指定的联接提取,但提取的关联的所有者不在选择列表中”。查询为“从组织o中选择新组织(o,计数(e.employeeId)),在(o.employees)中加入获取o.parentCompany p,其中o.OrganizationId按o分组”。甚至不确定这是否可行。这看起来不错,但是做类似于左连接的事情怎么样?如果一个组织没有员工,我仍然希望该组织列出,并且计数为零。