HIbernate OneToManyLoader executes select for each item in the collection
up vote
0
down vote
favorite
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.
hibernate
add a comment |
up vote
0
down vote
favorite
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.
hibernate
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
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.
hibernate
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.
hibernate
hibernate
asked Nov 9 at 19:00
user2782001
1,5641121
1,5641121
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
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.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
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.
add a comment |
up vote
1
down vote
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.
add a comment |
up vote
1
down vote
up vote
1
down vote
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.
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.
answered Nov 10 at 7:36
Ajish Thankachan
612
612
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53231822%2fhibernate-onetomanyloader-executes-select-for-each-item-in-the-collection%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown