With JPA Mapped Entities with one-to-many relationships, how can I add join criterias












1















Given the situation: The database was created when Hibernate wasn't born yet, we talk true legacy here.
I have tables that never have deleted records, just setting an active flag on the row to mark an entry as currently in use. Queries usually look like:



SELECT * from A left join B on A.id = B.a_id and B.active = 1


With Entity A and B defined in Java, and A has a property



@OneToMany
private Set<B> b;


How do I annotate the property to add the criteria "and B.active=1"?



JPA-solution preferred, but if necessary we can use hibernate annotations too.



In a similar way we have cases where entries have an active date range, so we would have to add a criteria similar to



"and B.active_From >= now() and (B.active_to is null or B.active_to < now())"









share|improve this question























  • Are you using Spring Framework with JPA?

    – Gaurav Srivastav
    Nov 20 '18 at 5:24











  • Hibernate specific solution is the only option here. See the paragraph on @Where here: baeldung.com/hibernate-dynamic-mapping. Hibernate also offers dynamic Filters however @Where seems to be what you are looking for. docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…

    – Alan Hay
    Nov 20 '18 at 9:16


















1















Given the situation: The database was created when Hibernate wasn't born yet, we talk true legacy here.
I have tables that never have deleted records, just setting an active flag on the row to mark an entry as currently in use. Queries usually look like:



SELECT * from A left join B on A.id = B.a_id and B.active = 1


With Entity A and B defined in Java, and A has a property



@OneToMany
private Set<B> b;


How do I annotate the property to add the criteria "and B.active=1"?



JPA-solution preferred, but if necessary we can use hibernate annotations too.



In a similar way we have cases where entries have an active date range, so we would have to add a criteria similar to



"and B.active_From >= now() and (B.active_to is null or B.active_to < now())"









share|improve this question























  • Are you using Spring Framework with JPA?

    – Gaurav Srivastav
    Nov 20 '18 at 5:24











  • Hibernate specific solution is the only option here. See the paragraph on @Where here: baeldung.com/hibernate-dynamic-mapping. Hibernate also offers dynamic Filters however @Where seems to be what you are looking for. docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…

    – Alan Hay
    Nov 20 '18 at 9:16
















1












1








1








Given the situation: The database was created when Hibernate wasn't born yet, we talk true legacy here.
I have tables that never have deleted records, just setting an active flag on the row to mark an entry as currently in use. Queries usually look like:



SELECT * from A left join B on A.id = B.a_id and B.active = 1


With Entity A and B defined in Java, and A has a property



@OneToMany
private Set<B> b;


How do I annotate the property to add the criteria "and B.active=1"?



JPA-solution preferred, but if necessary we can use hibernate annotations too.



In a similar way we have cases where entries have an active date range, so we would have to add a criteria similar to



"and B.active_From >= now() and (B.active_to is null or B.active_to < now())"









share|improve this question














Given the situation: The database was created when Hibernate wasn't born yet, we talk true legacy here.
I have tables that never have deleted records, just setting an active flag on the row to mark an entry as currently in use. Queries usually look like:



SELECT * from A left join B on A.id = B.a_id and B.active = 1


With Entity A and B defined in Java, and A has a property



@OneToMany
private Set<B> b;


How do I annotate the property to add the criteria "and B.active=1"?



JPA-solution preferred, but if necessary we can use hibernate annotations too.



In a similar way we have cases where entries have an active date range, so we would have to add a criteria similar to



"and B.active_From >= now() and (B.active_to is null or B.active_to < now())"






hibernate jpa






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 20 '18 at 5:22









KaiKai

7871127




7871127













  • Are you using Spring Framework with JPA?

    – Gaurav Srivastav
    Nov 20 '18 at 5:24











  • Hibernate specific solution is the only option here. See the paragraph on @Where here: baeldung.com/hibernate-dynamic-mapping. Hibernate also offers dynamic Filters however @Where seems to be what you are looking for. docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…

    – Alan Hay
    Nov 20 '18 at 9:16





















  • Are you using Spring Framework with JPA?

    – Gaurav Srivastav
    Nov 20 '18 at 5:24











  • Hibernate specific solution is the only option here. See the paragraph on @Where here: baeldung.com/hibernate-dynamic-mapping. Hibernate also offers dynamic Filters however @Where seems to be what you are looking for. docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…

    – Alan Hay
    Nov 20 '18 at 9:16



















Are you using Spring Framework with JPA?

– Gaurav Srivastav
Nov 20 '18 at 5:24





Are you using Spring Framework with JPA?

– Gaurav Srivastav
Nov 20 '18 at 5:24













Hibernate specific solution is the only option here. See the paragraph on @Where here: baeldung.com/hibernate-dynamic-mapping. Hibernate also offers dynamic Filters however @Where seems to be what you are looking for. docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…

– Alan Hay
Nov 20 '18 at 9:16







Hibernate specific solution is the only option here. See the paragraph on @Where here: baeldung.com/hibernate-dynamic-mapping. Hibernate also offers dynamic Filters however @Where seems to be what you are looking for. docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…

– Alan Hay
Nov 20 '18 at 9:16














1 Answer
1






active

oldest

votes


















1














You can use Hibernate's @Where annotation to filter elements from an association. You can find an example and explanation in this Hibernate Tip.



Here's the short version of it:



You can set an SQL snippet as the value of the clause attribute of the @Where annotation. So, your mapping should look like this:



@OneToMany
@Where(clause = "active = 1")
private Set<B> b;


And you can use the same approach to exclude the ones that are not within the time range



@OneToMany
@Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
private Set<B> b;





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',
    autoActivateHeartbeat: false,
    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%2f53386687%2fwith-jpa-mapped-entities-with-one-to-many-relationships-how-can-i-add-join-crit%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









    1














    You can use Hibernate's @Where annotation to filter elements from an association. You can find an example and explanation in this Hibernate Tip.



    Here's the short version of it:



    You can set an SQL snippet as the value of the clause attribute of the @Where annotation. So, your mapping should look like this:



    @OneToMany
    @Where(clause = "active = 1")
    private Set<B> b;


    And you can use the same approach to exclude the ones that are not within the time range



    @OneToMany
    @Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
    private Set<B> b;





    share|improve this answer






























      1














      You can use Hibernate's @Where annotation to filter elements from an association. You can find an example and explanation in this Hibernate Tip.



      Here's the short version of it:



      You can set an SQL snippet as the value of the clause attribute of the @Where annotation. So, your mapping should look like this:



      @OneToMany
      @Where(clause = "active = 1")
      private Set<B> b;


      And you can use the same approach to exclude the ones that are not within the time range



      @OneToMany
      @Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
      private Set<B> b;





      share|improve this answer




























        1












        1








        1







        You can use Hibernate's @Where annotation to filter elements from an association. You can find an example and explanation in this Hibernate Tip.



        Here's the short version of it:



        You can set an SQL snippet as the value of the clause attribute of the @Where annotation. So, your mapping should look like this:



        @OneToMany
        @Where(clause = "active = 1")
        private Set<B> b;


        And you can use the same approach to exclude the ones that are not within the time range



        @OneToMany
        @Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
        private Set<B> b;





        share|improve this answer















        You can use Hibernate's @Where annotation to filter elements from an association. You can find an example and explanation in this Hibernate Tip.



        Here's the short version of it:



        You can set an SQL snippet as the value of the clause attribute of the @Where annotation. So, your mapping should look like this:



        @OneToMany
        @Where(clause = "active = 1")
        private Set<B> b;


        And you can use the same approach to exclude the ones that are not within the time range



        @OneToMany
        @Where(clause = "active_from >= now() and (active_to is null or active_to < now())")
        private Set<B> b;






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 20 '18 at 17:17

























        answered Nov 20 '18 at 16:57









        Thorben JanssenThorben Janssen

        26516




        26516






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53386687%2fwith-jpa-mapped-entities-with-one-to-many-relationships-how-can-i-add-join-crit%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

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith