有没有一种方法可以在不初始化的情况下计算关联集合的大小?
例如
Select count(p.children) from Parent p
(由于我的where子句更加复杂,而from子句是多态查询,所以我不能以任何其他方式执行此操作是有充分的理由的)
谢谢。
除查询外,可能的解决方案可能是children使用lazy="extra"(使用XML表示法)映射。这样,您可以使用所需的任何查询来获取Parent,然后在parent.getChildren().size()不加载整个集合的情况下进行调用(仅SELECT COUNT执行类型查询)。
children
lazy="extra"
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()
如果您调用不是标识符getter方法的任何方法,就会初始化一个代理,如果您开始遍历它的元素或调用任何一个集合管理操作(例如size()和),则会初始化一个集合contains()。Hibernate提供了一个额外的设置,该设置对于大型集合最有用。它们可以映射为 额外的懒惰 。[…]
size()
contains()
[如上所述,]如果您调用,或size(),则不再初始化集合。-查询数据库以检索必要的信息。如果它是一个或一,操作 和也直接查询数据库。contains()``isEmpty()``Map``List``containsKey()``get()
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