Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразовать цепочку Stream API в JPQL / 10 сообщений из 10, страница 1 из 1
04.12.2020, 13:59
    #40024596
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Есть следующая цепочка:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public Collection<List<GaUtm>> getGaUtmGroupedByAccountLogin(List<String> loginsOfArchivedGaAccounts) {
   return gaUtmRepository.findAll()
           .stream()
           .filter(gaUtm -> !loginsOfArchivedGaAccounts.contains(gaUtm.getGaUtmId().getAccountLogin()))
           .collect(Collectors.groupingBy(gaUtm -> gaUtm.getGaUtmId().getAccountLogin()))
           .values(); 

    }



Сущности:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class GaUtm {

    @EmbeddedId
    private GaUtmId csGaUtmId;

    ...

}
...

@Embeddable
public class GaUtmId implements Serializable {

    @Column(name = "account_login")
    private String accountLogin;
}



Необходимо заменить эту операцию со стримами на JPQL запрос в репозитории, который будет делать и возвращать то же самое.
Код: java
1.
2.
3.
4.
5.
6.
7.
@Repository
public interface GaUtmRepository extends JpaRepository<GaUtm, GaUtmId> {

 @Query(...)
 Map<String, List<GaUtm>> findGaUtmGroupedByAccountLogin(List<String> loginsOfArchivedGaAccounts);

}


И как-то я застрял на группировке SELECT ...
Код: java
1.
@Query("SELECT .... FROM CsGaUtm utm WHERE utm.csGaUtmId.accountLogin NOT IN :logins")


Я не понимаю, что я должен вернуть из SELECT'a чтобы положить всё это в тот самый Collection или ту же мапу (Map<String, List<GaUtm>>).
Для группировки, наверное просто добавить:
Код: java
1.
... FROM CsGaUtm utm WHERE utm.gaUtmId.accountLogin NOT IN :logins GROUP BY utm.gaUtmId.accountLogin

?
...
Рейтинг: 0 / 0
04.12.2020, 15:49
    #40024673
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
я не великий спец ни по JPA ни по SQL, но по-моему так не получится. Группировка в SQL она для вычисления агрегатов каких-то, а в коде выше у нас просто разбиение на группы идет. Не ну т.е. можно конечно и в group by сделать агрегат, который превратит курсор в массив записей, т.е. вернет курсор вида account login -> [item1, item2] но это уже будет какая-то специфическая для БД имплементация и я сильно удивлюсь, если такое есть из коробки в jpa, даже с кастомным диалектом будет непортируемый геморрой. Разбей на группы уже в java.

P. S. сама идея разбить на группы, а потом вернуть "список списков" тоже сомнительна, т.к. его полезность по сравнению с мапой списков сильно ниже. Но может по условиям задачи так и надо, х.з.
...
Рейтинг: 0 / 0
04.12.2020, 16:08
    #40024679
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
chpasha,
+1
Список списков черезчур имхо
...
Рейтинг: 0 / 0
04.12.2020, 16:15
    #40024682
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Значит решение со стримами более "разумное"?
Что можно изменить в стриме? По сути мне ключи не нужны, нужны только значения. И прочитав ваши комментарии, я подумал, зачем здесь группировка, если делается .values.
P.S. Код достался по наследству.
...
Рейтинг: 0 / 0
04.12.2020, 16:24
    #40024684
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Wasteland Rebel,
Нужно отображение в бд.
Или модель.
Или то как выглядят данные в таблицах.
...
Рейтинг: 0 / 0
04.12.2020, 16:30
    #40024685
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
IMHO & AFAIK

Если данные УЖЕ fetch'нуты в RAM, то смысл использовать SQL для ПОВТОРНОГО получения тех же данных - особого нет.

Если данные НЕ fetch'нуты, то разумеется, лучше забрать только требующеся из БД ОДНИМ запросом и, при необходимости, потом доработать напильником.
...
Рейтинг: 0 / 0
04.12.2020, 16:36
    #40024687
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Wasteland Rebel,

Хммм... А почему ты сказал что новый метод повторяет выход старого, если типы возврата коллекции не совпадают?
...
Рейтинг: 0 / 0
04.12.2020, 16:41
    #40024688
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Wasteland Rebel
Значит решение со стримами более "разумное"?

не обязательно. как Леонид написал выше, зависит от того - где данные. Если их нужно так или сяк грузить из БД, то конечно фильтрацию, сортировку и что угодно еще лучше делать там. Но то, что там сделать нельзя или можно только ценой какого-то жуткого подвыперда с припрыгиванием, то лучше на стороне явы.

Wasteland Rebel
зачем здесь группировка, если делается .values

values возвращает список списков (что из сигнатуры метода тоже видно), т.е. каждый элемент в нем это N элементов с одинаковым accountlogin - т.е. даже без мапы группировка сохраняется. Потому я и написал выше, что странно это, т.к. обычно такое надо для последующего быстрого поиска по ключу в каком-то цикле, а без этого смысл не очевиден. нужно в вызывающем коде смотреть
...
Рейтинг: 0 / 0
04.12.2020, 16:54
    #40024690
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Обычно группируют чтобы выйти на результат:
- список входов в систему
Иванов 10Петров 15Сидоров 0
...
Это мапа строка-число из списка таблы всех входов в систему.
Поэтому что именно надо от группировки необхолимо знать.
Имхо
...
Рейтинг: 0 / 0
04.12.2020, 16:58
    #40024692
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразовать цепочку Stream API в JPQL
Если после стрима не результат а список опять объектов, то это расход памяти и недоделанный стрим.
То есть нужно знать желаемый резуьтат опять таки.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразовать цепочку Stream API в JPQL / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]