Is there a way I can count the size of an associated collection without initializing?
e.g.
Select count(p.children) from Parent p   (there is a good reason why I cant do this any other way as my where clause is more complicated and my from clause is a polymorphic query)
Thanks.
A possible solution other than queries might be mapping children with lazy="extra" (in XML notation). This way, you can fetch the Parent with whatever query you need, then call parent.getChildren().size() without loading the whole collection (only a SELECT COUNT type query is executed).
With annotations, it would be
@OneToMany @org.hibernate.annotations.LazyCollection( org.hibernate.annotations.LazyCollectionOption.EXTRA ) private Set<Child> children = new HashSet<Child>();   Update: Quote from Java Persistence with Hibernate, ch. 13.1.3:
A proxy is initialized if you call any method that is not the identifier getter method, a collection is initialized if you start iterating through its elements or if you call any of the collection-management operations, such as
size()andcontains(). Hibernate provides an additional setting that is mostly useful for large collections; they can be mapped as extra lazy. [...][Mapped as above,] the collection is no longer initialized if you call
size(),contains(), orisEmpty()— the database is queried to retrieve the necessary information. If it’s aMapor aList, the operationscontainsKey()andget()also query the database directly.
So with an entity mapped as above, you can then do
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 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With