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
除查询之外的可能解决方案可能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>();
Run Code Online (Sandbox Code Playgroud)
更新:引用Java Persistence with Hibernate,ch.13.1.3:
如果您调用任何不是标识符getter方法的方法,则初始化代理,如果您开始迭代其元素,或者如果您调用任何集合管理操作(如
size()和),则初始化集合contains().Hibernate提供了一个额外的设置,主要用于大型集合; 它们可以被映射为额外的懒惰.[...][如上所示,]如果您调用
size(),则不再初始化集合contains(),或者isEmpty()- 查询数据库以检索必要的信息.如果是aMap或aList,则操作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)
| 归档时间: |
|
| 查看次数: |
21031 次 |
| 最近记录: |