Class JoinUtil


  • public final class JoinUtil
    extends Object
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static <ID,​F extends Fetcher<?,​?,​?>,​R>
      Map<ID,​List<F>>
      joinOneToMany​(Supplier<Collection<R>> joinRightSide, Function<? super R,​? extends F> fetcherConstructor, Function<? super R,​? extends ID> getLeftSideIdFromRightSide)  
      static <ID,​F extends Fetcher<?,​?,​?>,​R,​C extends Collection<F>>
      Map<ID,​C>
      joinOneToMany​(Supplier<Collection<R>> innerJoinRightSide, Function<? super R,​? extends F> fetcherConstructor, Function<? super R,​? extends ID> getLeftSideIdFromRightSide, Supplier<? extends C> targetCollectionSupplier)
      Для двусторонних отношений типа OneToMany, когда leftSide не является владельцем отношения (в терминах JPA это означает, что на leftSide объявлено OneToMany(mappedBy = "..."), а на правой стороне JoinColumn)
      static <ID,​F extends Fetcher<?,​?,​?>,​R>
      Map<ID,​F>
      joinOneToOne​(Supplier<Collection<R>> fetchRightSide, Function<? super R,​? extends F> fetcherConstructor, Function<? super R,​? extends ID> getLeftSideIdFromRightSide)
      Метод для двусторонних отношений типа OneToOne, когда левая сторона отношения не является его владельцем (в терминах JPA это означает, что на leftSide отсутствует JoinColumn).
      В действительности для JPA этот метод (как и отношение данного типа) имеет малое практическое значение, так как при двустороннем отношении OneToOne правая сторона не может быть LAZY
      (то есть при загрузке левой стороны отношения используя репозиторий или EntityManager правая сторона так же всегда будет подгружаться, создавая проблему N+1).
      Если только не используется инструментация байт-кода:
      Ссылка
      static <ID,​F extends Fetcher<?,​?,​?>,​L,​R>
      Map<ID,​List<F>>
      joinToMany​(Supplier<Set<L>> innerJoin, Function<? super R,​? extends F> fetcherConstructor, Function<? super L,​? extends ID> getLeftSideId, Function<? super L,​Collection<R>> getRightSideByLeftSide)  
      static <ID,​F extends Fetcher<?,​?,​?>,​L,​R,​C extends Collection<F>>
      Map<ID,​C>
      joinToMany​(Supplier<Set<L>> innerJoinRightSide, Function<? super R,​? extends F> fetcherConstructor, Function<? super L,​? extends ID> getLeftSideId, Function<? super L,​Collection<R>> getRightSideByLeftSide, Supplier<? extends C> targetCollectionSupplier)
      Для общего типа отношений ToMany (unidirectional/bidirectional, OneToMany/ManyToMany).
      static <LID,​RID,​F extends Fetcher<?,​?,​?>,​L,​R>
      Map<LID,​F>
      joinToOne​(Collection<L> leftSide, Supplier<Collection<R>> fetchRightSide, Function<? super R,​? extends F> fetcherConstructor, Function<? super L,​? extends LID> getLeftSideId, Function<? super L,​? extends RID> getForeignKey, Function<? super R,​? extends RID> getRightSideId)
      Для отношений типа ToOne, когда leftSide является владельцем отношения (в терминах JPA это означает, что на leftSide объявлен JoinColumn)
      static <ID,​F extends Fetcher<?,​?,​?>,​L,​R>
      Map<ID,​F>
      joinToOnePrefetching​(Collection<L> leftSide, Runnable prefetchRightSide, Function<? super R,​? extends F> fetcherConstructor, Function<? super L,​? extends R> getOtherSideFromLeftSide, Function<? super L,​? extends ID> getLeftSideId)
      Метод для отношений типа ToOne, когда leftSide является владельцем отношения.
    • Method Detail

      • joinOneToMany

        public static <ID,​F extends Fetcher<?,​?,​?>,​R,​C extends Collection<F>> Map<ID,​C> joinOneToMany​(Supplier<Collection<R>> innerJoinRightSide,
                                                                                                                                          Function<? super R,​? extends F> fetcherConstructor,
                                                                                                                                          Function<? super R,​? extends ID> getLeftSideIdFromRightSide,
                                                                                                                                          Supplier<? extends C> targetCollectionSupplier)
        Для двусторонних отношений типа OneToMany, когда leftSide не является владельцем отношения (в терминах JPA это означает, что на leftSide объявлено OneToMany(mappedBy = "..."), а на правой стороне JoinColumn)
        Type Parameters:
        ID - Идентификатор левой стороны отношения
        F - Тип Fetcher
        R - Правая сторона отношения
        Parameters:
        innerJoinRightSide - Функция, возвращающая правую сторону отношения по левой стороне (inner-join)
        fetcherConstructor - Функция, возвращающая Fetcher <F> по экземпляру с правой стороны отношения
        getLeftSideIdFromRightSide - Функция, возвращающая идентификатор левой стороны отношения по правой стороне отношения (не null)
      • joinOneToMany

        public static <ID,​F extends Fetcher<?,​?,​?>,​R> Map<ID,​List<F>> joinOneToMany​(Supplier<Collection<R>> joinRightSide,
                                                                                                                  Function<? super R,​? extends F> fetcherConstructor,
                                                                                                                  Function<? super R,​? extends ID> getLeftSideIdFromRightSide)
      • joinToMany

        public static <ID,​F extends Fetcher<?,​?,​?>,​L,​R,​C extends Collection<F>> Map<ID,​C> joinToMany​(Supplier<Set<L>> innerJoinRightSide,
                                                                                                                                               Function<? super R,​? extends F> fetcherConstructor,
                                                                                                                                               Function<? super L,​? extends ID> getLeftSideId,
                                                                                                                                               Function<? super L,​Collection<R>> getRightSideByLeftSide,
                                                                                                                                               Supplier<? extends C> targetCollectionSupplier)
        Для общего типа отношений ToMany (unidirectional/bidirectional, OneToMany/ManyToMany). Специфичен для JPA (для OneToMany отношений лучше использовать joinOneToMany(java.util.function.Supplier<java.util.Collection<R>>, java.util.function.Function<? super R, ? extends F>, java.util.function.Function<? super R, ? extends ID>, java.util.function.Supplier<? extends C>))
        Type Parameters:
        ID - Тип идентификатора сущностей с левой стороны отношения
        F - Тип Fetcher
        L - Тип сущностей с левой стороны отношения
        R - Тип сущностей с правой стороны отношения
        C - Тип нужной коллекции
        Parameters:
        innerJoinRightSide - Функция, которая произведет inner join с правой стороной отношения и вернет distinct-подмножество leftSide (отфильтрованное по inner join).
        Ожидается, что после вызова этой функции JPA-провайдер проставит правую сторону отношения во все элементы данного подмножества (протестировано на hibernate).
        Например, для отношения (Сотрудник <-> Проект), которое является двусторонним ManyToMany отношением
        (сотрудник может работать над несколькими проектами и над проектом работает несколько сотрудников)
        данный JPQL запрос:
         @Query("SELECT e FROM Employee e JOIN FETCH e.projects WHERE e IN (?1)")
        Set<Employee> joinProjects(Collection<Employee> workers);
        проставит заджойненные Projects во все экземпляры Employee, которые переданы в метод
        fetcherConstructor - Функция, возвращающая <F> по экземпляру с правой стороны отношения
        getLeftSideId - Функция, возвращающая идентификатор экземпляра с левой стороны отношения
        getRightSideByLeftSide - Функция, возвращающая many-side
        targetCollectionSupplier - Supplier, возвращающий нужный тип коллекции <C>
      • joinToMany

        public static <ID,​F extends Fetcher<?,​?,​?>,​L,​R> Map<ID,​List<F>> joinToMany​(Supplier<Set<L>> innerJoin,
                                                                                                                       Function<? super R,​? extends F> fetcherConstructor,
                                                                                                                       Function<? super L,​? extends ID> getLeftSideId,
                                                                                                                       Function<? super L,​Collection<R>> getRightSideByLeftSide)
      • joinToOne

        public static <LID,​RID,​F extends Fetcher<?,​?,​?>,​L,​R> Map<LID,​F> joinToOne​(Collection<L> leftSide,
                                                                                                                            Supplier<Collection<R>> fetchRightSide,
                                                                                                                            Function<? super R,​? extends F> fetcherConstructor,
                                                                                                                            Function<? super L,​? extends LID> getLeftSideId,
                                                                                                                            Function<? super L,​? extends RID> getForeignKey,
                                                                                                                            Function<? super R,​? extends RID> getRightSideId)
        Для отношений типа ToOne, когда leftSide является владельцем отношения (в терминах JPA это означает, что на leftSide объявлен JoinColumn)
        Type Parameters:
        LID - Идентификатор сущности с левой стороны отношения
        RID - Идентификатор сущности с правой стороны отношения
        F - Тип Fetcher
        L - Левая сторона отношения
        R - Правая сторона отношения
        Parameters:
        leftSide - Левая сторона отношения
        fetchRightSide - Функция, возвращающая сущности с правой стороны отношения (inner-join)
        fetcherConstructor - Функция, возвращающая экземпляр класса Fetcher по сущности с правой стороны отношения
        getLeftSideId - Функция, возвращающая идентификатор экземпляра с левой стороны отношения
        getForeignKey - Функция, возвращающая идентификатор, по которому происходит join отношения (или null, если отношения нет)
        getRightSideId - Функция, возвращающая идентификатор сущности с правой стороны отношения
      • joinToOnePrefetching

        public static <ID,​F extends Fetcher<?,​?,​?>,​L,​R> Map<ID,​F> joinToOnePrefetching​(Collection<L> leftSide,
                                                                                                                           Runnable prefetchRightSide,
                                                                                                                           Function<? super R,​? extends F> fetcherConstructor,
                                                                                                                           Function<? super L,​? extends R> getOtherSideFromLeftSide,
                                                                                                                           Function<? super L,​? extends ID> getLeftSideId)
        Метод для отношений типа ToOne, когда leftSide является владельцем отношения. (в терминах JPA это означает, что на leftSide объявлен JoinColumn)
        В отличие от joinToOne(java.util.Collection<L>, java.util.function.Supplier<java.util.Collection<R>>, java.util.function.Function<? super R, ? extends F>, java.util.function.Function<? super L, ? extends LID>, java.util.function.Function<? super L, ? extends RID>, java.util.function.Function<? super R, ? extends RID>) полагается на то, что благодаря prefetch-у функция getOtherSideFromOwner не будет делать запрос.
        Именно так и работает hibernate для отношений ToOne в пределах сессии.
        Type Parameters:
        ID - Идентификатор владельца отношения
        F - Тип Fetcher
        L - Владелец отношения
        R - Правая сторона отношения
        Parameters:
        leftSide - Левая сторона отношения
        prefetchRightSide - Функция, которая делает предварительную выборку и сохраняет результаты выборки на левой стороне отношения
        fetcherConstructor - Функция, возвращающий экземпляр класса Fetcher по другой правой стороне отношения
        getOtherSideFromLeftSide - Функция, возвращающая другую сторону отношения по владельцу отношения (или null, если отношения нет)
        getLeftSideId - Функция, возвращающая идентификатор владельца отношения
      • joinOneToOne

        public static <ID,​F extends Fetcher<?,​?,​?>,​R> Map<ID,​F> joinOneToOne​(Supplier<Collection<R>> fetchRightSide,
                                                                                                           Function<? super R,​? extends F> fetcherConstructor,
                                                                                                           Function<? super R,​? extends ID> getLeftSideIdFromRightSide)
        Метод для двусторонних отношений типа OneToOne, когда левая сторона отношения не является его владельцем (в терминах JPA это означает, что на leftSide отсутствует JoinColumn).
        В действительности для JPA этот метод (как и отношение данного типа) имеет малое практическое значение, так как при двустороннем отношении OneToOne правая сторона не может быть LAZY
        (то есть при загрузке левой стороны отношения используя репозиторий или EntityManager правая сторона так же всегда будет подгружаться, создавая проблему N+1).
        Если только не используется инструментация байт-кода:
        Ссылка
        Type Parameters:
        ID - Идентификатор левой стороны отношения
        F - Тип Fetcher
        R - Правая сторона отношения
        Parameters:
        fetchRightSide - Метод, делающий join с правой стороной отношения
        fetcherConstructor - Метод, возвращающий Fetcher F по экземпляру правой стороны отношения
        getLeftSideIdFromRightSide - Метод, возвращающий идентификатор левой стороны отношения по правой стороне отношения (или null, если отношения нет)