|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Добрый день! Есть две таблицы связанные отношением многие-ко-многим - 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.06.2020, 11:39 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, Нельзя усидеть на двух стульях. Приходится выбирать, со стороны роли вы выборку делаете или со стороны юзверя. Напрмер, список СПРАВОЧНИК юзверей и у них массивы ролей. Если с обоих сторон то имхо каша. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 11:55 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
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.06.2020, 11:56 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, Дайте пример выходных данных ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 11:58 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, >Но тогда пейджинг не верный - учитываются только User, а надо как в первом запросе (учитывать и роли). == дайте пример на пальцах. Пейджинг даст первую страницу коллекию 10 юзверей из миллиона. И что? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:01 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Пример данных: 1 | Иванов | 1 | Администратор 1 | Иванов | 2 | Руководитель 2 | Петров | 1 | Администратор 2 | Петров | 3 | Бухгалтерия 3 | Сидоров | 5 | Отдел рекламы ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:14 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи 1 | Иванов | 1 | Администратор 1 | Иванов | 2 | Руководитель 2 | Петров | 1 | Администратор ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:16 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, Да. Это направление связи со стороны Справочника юзверей. Работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:32 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, gelListRoles() даст другой запрос и направление. И пагинацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:34 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи 1 | Иванов | 1 | Администратор 1 | Иванов | 2 | Руководитель 2 | Петров | 1 | Администратор Должна вернуться коллекция из двух с ленивым свойством массивом имя роли ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:38 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
авторДа. Это направление связи со стороны Справочника юзверей. Работает? Оно работает в том смысле, что возвращает всех 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.06.2020, 12:53 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Вернее даже не List <UserRole>, а Page<UserRole> ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 12:54 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Предыдущее работает если использую связь 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.06.2020, 13:03 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, Я имелл ввиду что надо разбить один сложный метод на два простых. gerUsersInfo() getRolesInfo() Точно так как делают в БД запросом с join. Ваш запрос выше не применяют к бд. Это полная инфа по трем таблицам и она бессмыслена. Имхо ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 13:19 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Информация нужна именно в том виде в котором я описал, и соответственно смысл есть. Если делать отдельно два простых запроса, то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет. Сейчас только проблема в сортировке. В принципе решение может быть, если понять как указать 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 Тогда должно заработать. Но как это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 13:42 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи 1 | Иванов | 1 | Администратор 1 | Иванов | 2 | Руководитель 2 | Петров | 1 | Администратор Таблица юзверей 10 чел Таблица ролей 15 ролей Таблица связей 1миллион. Вопрос: Сколько записей в КОЛЛЕКЦИИ тебе нужно при пагинации? Хотя слово записей неверное. ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 13:47 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, where u.userId = ur.userId and r.roleId = ur.roleId order by ur.username Принято запросы делать с join. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 13:49 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
PetroNotC Sharp shu_ra Соответственно пейджинг должен работать так. Если размер страницы 3 и page=0 , то должны вернуться 3 записи 1 | Иванов | 1 | Администратор 1 | Иванов | 2 | Руководитель 2 | Петров | 1 | Администратор Таблица юзверей 10 чел Таблица ролей 15 ролей Таблица связей 1миллион. Вопрос: Сколько записей в КОЛЛЕКЦИИ тебе нужно при пагинации? Хотя слово записей неверное. ? Ну, например, 10 записей. Плюс можно задать фильтры на имя user или имя role. Не совсем понятно, как влияет количество записей на проблему, которую я описал? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 15:38 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, Если 10 записей, то это мой вариант выше. Твой варриант - возврат миллиона. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 15:47 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
PetroNotC Sharp shu_ra, Если 10 записей, то это мой вариант выше. Твой варриант - возврат миллиона. То есть у меня будет 1 из 2 страниц пейбжинга. У тебя будет первая из 100000 страниц пейджинга ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 15:49 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, >то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет = дык покажи в чем сложность то. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 15:53 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
PetroNotC Sharp shu_ra, Если 10 записей, то это мой вариант выше. Твой варриант - возврат миллиона. Не понятно. Запрос ограничен количеством, равным размеру страницы. Какой миллион? Не говоря о том что максимум 10 * 15 = 150. select ur.* from ur limit 10. Может быть кто-то делал выборку из таблиц связанных между собой многие-ко многим. Поделитесь пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 16:18 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
shu_ra, Блин, пример выше в табле миллион. Тогда твой запрос идет на миллион. Скажи сколько у тебя в средней таблице. Что сложного в в двух методах ты тоже не сказал. Я не против, ищи в вебе пример много ко много. Жди подсказок если лень пример сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 17:00 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
PetroNotC Sharp shu_ra, >то придется самостоятельно делать сложную реализацию пейджинга, фильтрации и сортировки. Это намного все усложняет = дык покажи в чем сложность то. ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 17:02 |
|
Spring + PagingAndSortingRepository + Many-to-Many
|
|||
---|---|---|---|
#18+
Покажи весь джавовый код - непонятно, что ты конкретно делаешь. Если без UserRole модели, то должно быть как-то так: Код: java 1. 2.
Если с UserRole, то непонять зачем ты там вообще держишь айдишники userId и roleId. Почему бы в этой моделе сразу не держать User и Role, и работать с ними без всяких джойнов в hql ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2020, 17:38 |
|
|
start [/forum/topic.php?fid=59&msg=39973624&tid=2120762]: |
0ms |
get settings: |
3ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
59ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
437ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 798ms |
0 / 0 |