user2782001
user2782001

Reputation: 3488

HIbernate OneToManyLoader executes select for each item in the collection

I'm running a grails app that doesn't support the hibernate fetch mode subselect. Each item in a collection is fetched with a separate select statement.

I found this stackoverflow suggestion Hibernate: best practice to pull all lazy collections

entity.collection.size()// call size to force hibernate to load the full collection

But this causes a separate select for each item in the collection.

So, I found a utility class on github written to be a stand-in for grails specifically https://gist.github.com/mirasrael/2fb953ee95b0c9d16880e4cfb2477e76

I got it running for my version of Hibernate, but the key lines....

CollectionLoader loader = new OneToManyLoader(collectionPersister, entityIds.length, sf, LoadQueryInfluencers.NONE) :
loader.loadCollectionBatch(session, entityIds, collectionPersister.getKeyType());

...cause Hibernate to run a separate select query for each item in the collection still, which isn't the expected behavior.

I started reading through available Hibernate source code, but I don't know where to start in attempting to polyfill this missing feature.

Upvotes: 0

Views: 171

Answers (1)

Ajish
Ajish

Reputation: 96

Try this,

 @OneToMany(fetch = FetchType.EAGER)
 @Fetch(value = FetchMode.SELECT)
 @BatchSize(size = 10)
 private Set<Child> child= new HashSet<Child>();

It will execute only two queries one for parent and one for child collection.Depending on size value it will load collection.

Upvotes: 1

Related Questions