gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:52:26 26 4
gpt4 key购买 nike

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

Organisation
- OrgID
- OrgName

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

在 jsp 页面上,我想显示所有组织的列表和员 worker 数,而不需要加载员工本身。如果它可以是加载所有 Organization 对象并以某种方式加载一定数量的 Employee 对象的单个数据库命中,那就太好了。我宁愿避免使用一个查询来列出组织,然后为每个组织使用一个查询来计算员 worker 数。我想我可以添加一个 transient 属性来保存计数,但我不确定如何最好地做到这一点。

仅给出规模的概念,将有大约 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

关于java - JPA:如何在不加载延迟加载集的情况下计算子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11682366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com