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.










share|improve this question

























    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.










    share|improve this question























      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.










      share|improve this question













      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 9 at 19:00









      user2782001

      1,5641121




      1,5641121






















          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.






          share|improve this answer




















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













             

            draft saved


            draft discarded


















            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

























            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.






            share|improve this answer
























              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.






              share|improve this answer






















                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.






                share|improve this answer












                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.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 10 at 7:36









                Ajish Thankachan

                612




                612



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Use pre created SQLite database for Android project in kotlin

                    Darth Vader #20

                    Ondo