public final class JoinUtil extends Object
| Modifier and Type | Method and Description |
|---|---|
static <ID,F extends Fetcher<?,?,?>,R> |
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>> |
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> |
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> |
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>> |
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> |
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> |
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 является владельцем отношения. |
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)ID - Идентификатор левой стороны отношенияF - Тип Fetcher-аR - Правая сторона отношенияinnerJoinRightSide - Функция, возвращающая правую сторону отношения по левой стороне (inner-join)fetcherConstructor - Функция, возвращающая Fetcher <F> по экземпляру с правой стороны отношенияgetLeftSideIdFromRightSide - Функция, возвращающая идентификатор левой стороны отношения по правой стороне отношения (не null)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)
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)
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>))ID - Тип идентификатора сущностей с левой стороны отношенияF - Тип FetcherL - Тип сущностей с левой стороны отношенияR - Тип сущностей с правой стороны отношенияC - Тип нужной коллекцииinnerJoinRightSide - Функция, которая произведет inner join с правой стороной отношения и
вернет distinct-подмножество leftSide (отфильтрованное по inner join).
@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-sidetargetCollectionSupplier - Supplier, возвращающий нужный тип коллекции <C>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)
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)LID - Идентификатор сущности с левой стороны отношенияRID - Идентификатор сущности с правой стороны отношенияF - Тип FetcherL - Левая сторона отношенияR - Правая сторона отношенияleftSide - Левая сторона отношенияfetchRightSide - Функция, возвращающая сущности с правой стороны отношения (inner-join)fetcherConstructor - Функция, возвращающая экземпляр класса Fetcher по сущности с правой стороны отношенияgetLeftSideId - Функция, возвращающая идентификатор экземпляра с левой стороны отношенияgetForeignKey - Функция, возвращающая идентификатор, по которому происходит join отношения (или null, если отношения нет)getRightSideId - Функция, возвращающая идентификатор сущности с правой стороны отношения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 в пределах сессии.ID - Идентификатор владельца отношенияF - Тип FetcherL - Владелец отношенияR - Правая сторона отношенияleftSide - Левая сторона отношенияprefetchRightSide - Функция, которая делает предварительную выборку и сохраняет результаты выборки на левой стороне отношенияfetcherConstructor - Функция, возвращающий экземпляр класса Fetcher по другой правой стороне отношенияgetOtherSideFromLeftSide - Функция, возвращающая другую сторону отношения по владельцу отношения (или null, если отношения нет)getLeftSideId - Функция, возвращающая идентификатор владельца отношения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)
leftSide отсутствует JoinColumn).EntityManager
правая сторона так же всегда будет подгружаться, создавая проблему N+1).ID - Идентификатор левой стороны отношенияF - Тип FetcherR - Правая сторона отношенияfetchRightSide - Метод, делающий join с правой стороной отношенияfetcherConstructor - Метод, возвращающий Fetcher F по экземпляру правой стороны отношенияgetLeftSideIdFromRightSide - Метод, возвращающий идентификатор левой стороны отношения по правой стороне отношения (или null, если отношения нет)Copyright © 2022 I-Novus LLC. All rights reserved.