0

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.

user2782001
  • 2,928
  • 2
  • 15
  • 32

1 Answers1

1

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.

Ajish
  • 71
  • 3