Class JoinUtil
- java.lang.Object
-
- net.n2oapp.platform.selection.api.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- ТипFetcherL- Тип сущностей с левой стороны отношения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)")проставит заджойненные Projects во все экземпляры Employee, которые переданы в метод
Set<Employee> joinProjects(Collection<Employee> workers);fetcherConstructor- Функция, возвращающая<F>по экземпляру с правой стороны отношенияgetLeftSideId- Функция, возвращающая идентификатор экземпляра с левой стороны отношенияgetRightSideByLeftSide- Функция, возвращающая many-sidetargetCollectionSupplier-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- ТипFetcherL- Левая сторона отношения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- ТипFetcherL- Владелец отношения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- ТипFetcherR- Правая сторона отношения- Parameters:
fetchRightSide- Метод, делающийjoinс правой стороной отношенияfetcherConstructor- Метод, возвращающийFetcherFпо экземпляру правой стороны отношенияgetLeftSideIdFromRightSide- Метод, возвращающий идентификатор левой стороны отношения по правой стороне отношения (илиnull, если отношения нет)
-
-