Hibernate计数集合大小而不初始化

DD.*_*DD. 37 java hibernate lazy-loading

有没有办法可以在没有初始化的情况下计算相关集合的大小?

例如

Select count(p.children) from Parent p
Run Code Online (Sandbox Code Playgroud)

(有一个很好的理由为什么我不能以任何其他方式执行此操作,因为我的where子句更复杂并且我的from子句是一个多态查询)

谢谢.

Pét*_*rök 60

除查询之外的可能解决方案可能childrenlazy="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>();
Run Code Online (Sandbox Code Playgroud)

更新:引用Java Persistence with Hibernate,ch.13.1.3:

如果您调用任何不是标识符getter方法的方法,则初始化代理,如果您开始迭代其元素,或者如果您调用任何集合管理操作(如size()和),则初始化集合contains().Hibernate提供了一个额外的设置,主要用于大型集合; 它们可以被映射为额外的懒惰.[...]

[如上所示,]如果您调用size(),则不再初始化集合contains(),或者isEmpty()- 查询数据库以检索必要的信息.如果是a Map或a 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
Run Code Online (Sandbox Code Playgroud)

  • 当心,有一个错误:https://hibernate.atlassian.net/browse/HHH-9227 (2认同)