一尘不染

休眠计数集合大小,无需初始化

hibernate

有没有一种方法可以在不初始化的情况下计算关联集合的大小?

例如

Select count(p.children) from Parent p

(由于我的where子句更加复杂,而from子句是多态查询,所以我不能以任何其他方式执行此操作是有充分的理由的)

谢谢。


阅读 191

收藏
2020-06-20

共1个答案

一尘不染

除查询外,可能的解决方案可能是children使用lazy="extra"(使用XML表示法)映射。这样,您可以使用所需的任何查询来获取Parent,然后在parent.getChildren().size()不加载整个集合的情况下进行调用(仅SELECT COUNT执行类型查询)。

有了注释,它将是

@OneToMany
@org.hibernate.annotations.LazyCollection(
org.hibernate.annotations.LazyCollectionOption.EXTRA
)
private Set<Child> children = new HashSet<Child>();

更新: 引用Java
Persistence与Hibernate的相关内容
,第ch。13.1.3:

如果您调用不是标识符getter方法的任何方法,就会初始化一个代理,如果您开始遍历它的元素或调用任何一个集合管理操作(例如size()和),则会初始化一个集合contains()。Hibernate提供了一个额外的设置,该设置对于大型集合最有用。它们可以映射为
额外的懒惰 。[…]

[如上所述,]如果您调用,或size(),则不再初始化集合。-查询数据库以检索必要的信息。如果它是一个或一,操作
和也直接查询数据库。contains()``isEmpty()``Map``List``containsKey()``get()

因此,使用如上所述映射的实体,您可以

Parent p = // execute query to load desired parent
// due to lazy loading, at this point p.children is a proxy object
int count = p.getChildren().size(); // the collection is not loaded, only its size
2020-06-20