powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring + PagingAndSortingRepository + Many-to-Many
25 сообщений из 42, страница 1 из 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
25 сообщений из 42, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring + PagingAndSortingRepository + Many-to-Many
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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