Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
Добрый день!

Есть две таблицы связанные отношением многие-ко-многим - 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 получить данные сразу из двух таблиц связанных многие-ко-многим, так чтобы и сортировка динамически задавалась и пейджинг работал.


Спасибо.
26 июн 20, 11:39    [22157693]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,

Нельзя усидеть на двух стульях.
Приходится выбирать, со стороны роли вы выборку делаете или со стороны юзверя.
Напрмер, список СПРАВОЧНИК юзверей и у них массивы ролей.
Если с обоих сторон то имхо каша.
26 июн 20, 11:55    [22157701]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
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
26 июн 20, 11:56    [22157702]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,

Дайте пример выходных данных
26 июн 20, 11:58    [22157703]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,

>Но тогда пейджинг не верный - учитываются только User, а надо как в первом запросе (учитывать и роли).
== дайте пример на пальцах.
Пейджинг даст первую страницу коллекию 10 юзверей из миллиона.
И что?
26 июн 20, 12:01    [22157706]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
Пример данных:

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор
2 | Петров | 3 | Бухгалтерия
3 | Сидоров | 5 | Отдел рекламы
26 июн 20, 12:14    [22157713]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

1 | Иванов | 1 | Администратор
1 | Иванов | 2 | Руководитель
2 | Петров | 1 | Администратор
26 июн 20, 12:16    [22157714]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,

Да. Это направление связи со стороны Справочника юзверей. Работает?
26 июн 20, 12:32    [22157727]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,

gelListRoles() даст другой запрос и направление. И пагинацию.
26 июн 20, 12:34    [22157730]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

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

Должна вернуться коллекция из двух с ленивым свойством массивом имя роли
26 июн 20, 12:38    [22157733]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
автор
Да. Это направление связи со стороны Справочника юзверей. Работает?


Оно работает в том смысле, что возвращает всех 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
26 июн 20, 12:53    [22157744]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
Вернее даже не List <UserRole>, а Page<UserRole>
26 июн 20, 12:54    [22157745]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
Предыдущее работает если использую связь 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
26 июн 20, 13:03    [22157757]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,
Я имелл ввиду что надо разбить один сложный метод на два простых.
gerUsersInfo()
getRolesInfo()
Точно так как делают в БД запросом с join.
Ваш запрос выше не применяют к бд. Это полная инфа по трем таблицам и она бессмыслена.
Имхо
26 июн 20, 13:19    [22157775]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
Информация нужна именно в том виде в котором я описал, и соответственно смысл есть.
Если делать отдельно два простых запроса, то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет. Сейчас только проблема в сортировке.

В принципе решение может быть, если понять как указать 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 byusername

Тогда должно заработать. Но как это сделать?
26 июн 20, 13:42    [22157794]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

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

Таблица юзверей 10 чел
Таблица ролей 15 ролей
Таблица связей 1миллион.
Вопрос:
Сколько записей в КОЛЛЕКЦИИ тебе нужно при пагинации?
Хотя слово записей неверное.
?
26 июн 20, 13:47    [22157799]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,
where u.userId = ur.userId
and r.roleId = ur.roleId
order by ur.username

Принято запросы делать с join.
26 июн 20, 13:49    [22157801]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
PetroNotC Sharp
shu_ra
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи

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

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


Ну, например, 10 записей. Плюс можно задать фильтры на имя user или имя role. Не совсем понятно, как влияет количество записей на проблему, которую я описал?
26 июн 20, 15:38    [22157849]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,


Если 10 записей, то это мой вариант выше.
Твой варриант - возврат миллиона.
26 июн 20, 15:47    [22157854]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
PetroNotC Sharp
shu_ra,


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

То есть у меня будет 1 из 2 страниц пейбжинга.
У тебя будет первая из 100000 страниц пейджинга
26 июн 20, 15:49    [22157856]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,

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

= дык покажи в чем сложность то.
26 июн 20, 15:53    [22157859]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
shu_ra
Member

Откуда:
Сообщений: 12
PetroNotC Sharp
shu_ra,


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


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


Может быть кто-то делал выборку из таблиц связанных между собой многие-ко многим. Поделитесь пожалуйста.
26 июн 20, 16:18    [22157875]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
shu_ra,
Блин, пример выше в табле миллион. Тогда твой запрос идет на миллион.
Скажи сколько у тебя в средней таблице.
Что сложного в в двух методах ты тоже не сказал.
Я не против, ищи в вебе пример много ко много. Жди подсказок если лень пример сделать.
26 июн 20, 17:00    [22157901]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
PetroNotC Sharp
shu_ra,

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

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

?
26 июн 20, 17:02    [22157902]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
SpringMan
Member

Откуда:
Сообщений: 207
Покажи весь джавовый код - непонятно, что ты конкретно делаешь.
Если без UserRole модели, то должно быть как-то так:
    @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
26 июн 20, 17:38    [22157924]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
shu_ra

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

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

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

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

Pagination - зависит от dbms. Грубо говоря он проприетарный. Limit/Offset - Postgres. Limit(Limit(...)) - Oracle. И так далее.
Ты должен нам рассказать какой диалект SQL у тебя используется. Иначе наши ответы будут - зря потраченным временем.
26 июн 20, 17:38    [22157925]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,
Мысль пришла, что пагинация всегда в конце. То есть сначала должно все работать без слова пагинация вообще.
Логично?
А далее смотреть уже реализацию пагинации.
26 июн 20, 18:22    [22157945]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
SpringMan,
Думаю модель есть, т.к. запросы генерятся у него.
26 июн 20, 18:45    [22157955]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
PetroNotC Sharp
mayton,
Мысль пришла, что пагинация всегда в конце. То есть сначала должно все работать без слова пагинация вообще.
Логично?
А далее смотреть уже реализацию пагинации.

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

Не бином Ньютона. Просто бухгалтерская арифметика. Эту задачу можно решать 1000 способами. Но автор наверное хочет Spring.
Вот и мучается танталовыми муками.
26 июн 20, 19:29    [22157967]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,
Если пагинация серверная, то надо править sql. А он у него генерится хибером.
Иначе придет миллион на клиента.
26 июн 20, 19:42    [22157972]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
Какой миллион?

Таблица юзверей 10 чел
Таблица ролей 15 ролей
Таблица связей 1миллион.

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

И это вообще максимум для таких условий. Это при условии что ВСЕМ юзерам даны ВСЕ роли.
26 июн 20, 19:52    [22157978]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,
1. Принцип от этого разве меняется? Или методология запросов?
2. Если добавить колонку дата или флаг Заблокироввно/Актуальность, то будет миллион. Так?
27 июн 20, 10:01    [22158119]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,
Много ко многим это классика Покупатели - Заказы - Товары
27 июн 20, 10:03    [22158120]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,

>Здесь физически
Модель в РСУБД строится Физическая и Логическая.
27 июн 20, 10:05    [22158121]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
У него не будет заказов. У него - модель безопасности. Двумерная.
И зачем мы будем втаскивать в задачу третье измерение?

Сообщение было отредактировано: 27 июн 20, 10:05
27 июн 20, 10:06    [22158123]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,
2. Профи обязан предупредить. Я предупреждаю.
3. Ты DBA был? Запросы изменятся разве?
27 июн 20, 10:09    [22158125]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
А мы глубоко копнули. Я думаю что автору и не надо так глубоко.
27 июн 20, 10:10    [22158126]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton
А мы глубоко копнули. Я думаю что автору и не надо так глубоко.

Да. Он вообще пропал.
Ему лень сказать без пагинации работает или нет. И сколько записей без нее идет на клиента.
27 июн 20, 10:15    [22158128]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
Я всё больше склоняюсь к пользе "вопросников" где вопрос ставится на таймер. И по проишествии просто нескольких
суток автоматом закрывается. А правильные ответы просто голосуются. К сожалению sql.ru - это не вопросник.
И здесь - седьмая вода на киселе будет размазана на годы. И автор к тому времени уже уволен или отчислен
с факультета.
27 июн 20, 10:41    [22158136]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
mayton,
хмм... я знаю один форум. Так такое введено. Но мне категорически не нравится. Там админ решает - ответили на вопрос или нет. Как будто он семи пядей во лбу.
"Всё хорошо в меру"
27 июн 20, 10:44    [22158138]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
Я тоже не люблю тостеры и стековер.
27 июн 20, 12:10    [22158166]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
Zzz79
Member

Откуда:
Сообщений: 569
shu_ra,
у вас изначально неправильно выстроена архитектура ,при которой у юзера может быть множество ролей

все это фиксится в springSecurity в две строчки кода,вы можете указать какие роли будут доступны для данного учатска кода

это дает вам гибкий интсрумент для настройки доступа к разным частям проекта без танцев с бубном
27 июн 20, 20:24    [22158349]     Ответить | Цитировать Сообщить модератору
 Re: Spring + PagingAndSortingRepository + Many-to-Many  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5383
Zzz79,
Ну почему неправильно.
Если ручками делать то правильно - много ко много.
Если не руками, а волшебными либами то вы правы. Есть такие.
27 июн 20, 22:17    [22158392]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Java Ответить