powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring + PagingAndSortingRepository + Many-to-Many
42 сообщений из 42, показаны все 2 страниц
Spring + PagingAndSortingRepository + Many-to-Many
    #39973496
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть две таблицы связанные отношением многие-ко-многим - User и Role.
Необходимо сделать запрос с данными из этих двух таблиц, например с полями userId, userName, roleId, roleName.

select u.userId, u.userName, r.roleId, r.roleName
from user u, role r, user_role ur
where u.userId = ur.userId
and r.roleId = ur.roleId

При этом нужна разбивка на страницы и сортировка.
Сейчас реализовано в Spring:
- есть два Entity User и Role связанные Many-to-Many
- есть UserRepository и RoleRepository extends PagingAndSortingRepository

Это позволяет легко получить всех User и для каждого User массив Role. Но тогда пейджинг не верный - учитываются только User, а надо как в первом запросе (учитывать и роли). Плюс не работает сортировка по Role.

Есть вариант явно определить промежуточную таблицу и связать через One-To-Many и использовать UserRoleRepository. Пейджинг работает, но там возникает проблема с сортировкой и по User и по Role.

Собственно вопрос такой. Как с помощью JPA получить данные сразу из двух таблиц связанных многие-ко-многим, так чтобы и сортировка динамически задавалась и пейджинг работал.


Спасибо.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973501
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

Нельзя усидеть на двух стульях.
Приходится выбирать, со стороны роли вы выборку делаете или со стороны юзверя.
Напрмер, список СПРАВОЧНИК юзверей и у них массивы ролей.
Если с обоих сторон то имхо каша.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973502
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

select u.userId, u.userName, r.roleId, r.roleName
from user u, role r, user_role ur
where u.userId = ur.userId
and r.roleId = ur.roleId

Переделать через join
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973503
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

Дайте пример выходных данных
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973505
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

>Но тогда пейджинг не верный - учитываются только User, а надо как в первом запросе (учитывать и роли).
== дайте пример на пальцах.
Пейджинг даст первую страницу коллекию 10 юзверей из миллиона.
И что?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973510
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример данных:

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор
2 | Петров | 3 | Бухгалтерия
3 | Сидоров | 5 | Отдел рекламы
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973511
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973517
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

Да. Это направление связи со стороны Справочника юзверей. Работает?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973519
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

gelListRoles() даст другой запрос и направление. И пагинацию.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973520
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор

Должна вернуться коллекция из двух с ленивым свойством массивом имя роли
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973527
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторДа. Это направление связи со стороны Справочника юзверей. Работает?

Оно работает в том смысле, что возвращает всех user и у каждого user коллекция role:
Page<User> users и у каждого user List<Role>roles.

А надо чтобы возвращало коллекцию userId, userName, roleId, roleName:
List <UserRole>
где UserRole:
int userId,
String userName,
int roleId,
String roleName
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973528
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вернее даже не List <UserRole>, а Page<UserRole>
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973535
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предыдущее работает если использую связь Many-To-Many, без явного описания отдельной сущности UserRole.
Если явно описываю UserRole и использую репозиторий UserRoleRepository:
interface UserRoleRepository extends PagingAndSortingRepository<UserRoleRepository, String>
, то соответственно возвращаются только два поля: userId и roleId.

И сортировка по полям таблицы User и Role в этом случае не работает. Если сделать что-то типа
Page<UserRole>findAll(pageable) и в pageable.sort = username, то будет ошибка. Потому что сформируется запрос вида
select ur.* from user_role ur order by ur.username
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973546
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,
Я имелл ввиду что надо разбить один сложный метод на два простых.
gerUsersInfo()
getRolesInfo()
Точно так как делают в БД запросом с join.
Ваш запрос выше не применяют к бд. Это полная инфа по трем таблицам и она бессмыслена.
Имхо
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973558
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Информация нужна именно в том виде в котором я описал, и соответственно смысл есть.
Если делать отдельно два простых запроса, то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет. Сейчас только проблема в сортировке.

В принципе решение может быть, если понять как указать sort в pageable так чтобы он не добавлял алиас в order by.

То есть формируется запрос
select u.userId, u.userName, r.roleId, r.roleName
from user u, role r, user_role ur
where u.userId = ur.userId
and r.roleId = ur.roleId
order by ur. username

А надо без алиаса
select u.userId, u.userName, r.roleId, r.roleName
from user u, role r, user_role ur
where u.userId = ur.userId
and r.roleId = ur.roleId
order by username

Тогда должно заработать. Но как это сделать?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973560
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор

Таблица юзверей 10 чел
Таблица ролей 15 ролей
Таблица связей 1миллион.
Вопрос:
Сколько записей в КОЛЛЕКЦИИ тебе нужно при пагинации?
Хотя слово записей неверное.
?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973562
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,
where u.userId = ur.userId
and r.roleId = ur.roleId
order by ur.username

Принято запросы делать с join.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973586
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
shu_ra
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор

Таблица юзверей 10 чел
Таблица ролей 15 ролей
Таблица связей 1миллион.
Вопрос:
Сколько записей в КОЛЛЕКЦИИ тебе нужно при пагинации?
Хотя слово записей неверное.
?


Ну, например, 10 записей. Плюс можно задать фильтры на имя user или имя role. Не совсем понятно, как влияет количество записей на проблему, которую я описал?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973589
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,


Если 10 записей, то это мой вариант выше.
Твой варриант - возврат миллиона.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973591
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
shu_ra,


Если 10 записей, то это мой вариант выше.
Твой варриант - возврат миллиона.

То есть у меня будет 1 из 2 страниц пейбжинга.
У тебя будет первая из 100000 страниц пейджинга
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973594
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,

>то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет

= дык покажи в чем сложность то.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973606
shu_ra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
shu_ra,


Если 10 записей, то это мой вариант выше.
Твой варриант - возврат миллиона.


Не понятно. Запрос ограничен количеством, равным размеру страницы. Какой миллион? Не говоря о том что максимум 10 * 15 = 150.
select ur.* from ur limit 10.


Может быть кто-то делал выборку из таблиц связанных между собой многие-ко многим. Поделитесь пожалуйста.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973623
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra,
Блин, пример выше в табле миллион. Тогда твой запрос идет на миллион.
Скажи сколько у тебя в средней таблице.
Что сложного в в двух методах ты тоже не сказал.
Я не против, ищи в вебе пример много ко много. Жди подсказок если лень пример сделать.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973624
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
shu_ra,

>то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет

= дык покажи в чем сложность то.

?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973635
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покажи весь джавовый код - непонятно, что ты конкретно делаешь.
Если без UserRole модели, то должно быть как-то так:
Код: java
1.
2.
    @Query(value = "select u.userName, r.roleName from UserEntity u join u.roles r")
    Page<Object> getPage(Pageable pageable);


Если с UserRole, то непонять зачем ты там вообще держишь айдишники userId и roleId. Почему бы в этой моделе сразу не держать User и Role, и работать с ними без всяких джойнов в hql
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973636
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shu_ra

Может быть кто-то делал выборку из таблиц связанных между собой многие-ко многим. Поделитесь пожалуйста.

Мы все делали эту выборку. Но непонятно что ты хочешь.

В первом посту у тебя уже половина решенной задачи. Что хочешь с сней сделать дальше?

Сортировать - добавь order by.

Pagination - зависит от dbms. Грубо говоря он проприетарный. Limit/Offset - Postgres. Limit(Limit(...)) - Oracle. И так далее.
Ты должен нам рассказать какой диалект SQL у тебя используется. Иначе наши ответы будут - зря потраченным временем.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973646
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Мысль пришла, что пагинация всегда в конце. То есть сначала должно все работать без слова пагинация вообще.
Логично?
А далее смотреть уже реализацию пагинации.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973651
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan,
Думаю модель есть, т.к. запросы генерятся у него.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973655
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
Мысль пришла, что пагинация всегда в конце. То есть сначала должно все работать без слова пагинация вообще.
Логично?
А далее смотреть уже реализацию пагинации.

Я вообще не понимаю в чем проблема для современного разработчика - порезать ResultSet на порции?
Допустим яб не знал SQL мог просто сделать 2 джойна. Ну пореж выборку по пачкам и делу конец
уже на фазе итерации строк.

Не бином Ньютона. Просто бухгалтерская арифметика. Эту задачу можно решать 1000 способами. Но автор наверное хочет Spring.
Вот и мучается танталовыми муками.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973657
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Если пагинация серверная, то надо править sql. А он у него генерится хибером.
Иначе придет миллион на клиента.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973661
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой миллион?

Таблица юзверей 10 чел
Таблица ролей 15 ролей
Таблица связей 1миллион.
Здесь физически не может быть столько. Это матрица. По вертикали юзеры. По горизонтали роли.
10 * 15 = 150 пересечений. Как в морской бой. Делать больше связей нет смысла ибо незаачем.

И это вообще максимум для таких условий. Это при условии что ВСЕМ юзерам даны ВСЕ роли.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973707
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
1. Принцип от этого разве меняется? Или методология запросов?
2. Если добавить колонку дата или флаг Заблокироввно/Актуальность, то будет миллион. Так?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973708
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Много ко многим это классика Покупатели - Заказы - Товары
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973709
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

>Здесь физически
Модель в РСУБД строится Физическая и Логическая.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973710
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У него не будет заказов. У него - модель безопасности. Двумерная.
И зачем мы будем втаскивать в задачу третье измерение?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973712
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
2. Профи обязан предупредить. Я предупреждаю.
3. Ты DBA был? Запросы изменятся разве?
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973713
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мы глубоко копнули. Я думаю что автору и не надо так глубоко.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973714
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А мы глубоко копнули. Я думаю что автору и не надо так глубоко.

Да. Он вообще пропал.
Ему лень сказать без пагинации работает или нет. И сколько записей без нее идет на клиента.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973715
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я всё больше склоняюсь к пользе "вопросников" где вопрос ставится на таймер. И по проишествии просто нескольких
суток автоматом закрывается. А правильные ответы просто голосуются. К сожалению sql.ru - это не вопросник.
И здесь - седьмая вода на киселе будет размазана на годы. И автор к тому времени уже уволен или отчислен
с факультета.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973716
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
хмм... я знаю один форум. Так такое введено. Но мне категорически не нравится. Там админ решает - ответили на вопрос или нет. Как будто он семи пядей во лбу.
"Всё хорошо в меру"
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже не люблю тостеры и стековер.
...
Рейтинг: 0 / 0
Spring + PagingAndSortingRepository + Many-to-Many
    #39973811
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79,
Ну почему неправильно.
Если ручками делать то правильно - много ко много.
Если не руками, а волшебными либами то вы правы. Есть такие.
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring + PagingAndSortingRepository + Many-to-Many
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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