Принимает ли предложение HQL IN только ограниченное количество значений (база данных MySQL)?
Вот моя упрощенная база данных:
user_post
- id
- post_id (FK)
post
- id
- link_id (FK)
link
- id
У меня есть список user_post
и я хочу получить для каждого из них link
они связаны с.
В настоящее время я делаю это так:
SELECT userPost.post.link FROM UserPost userPost WHERE userPost IN (:userPosts)
Прекрасно работает, но, может быть, позже я получу огромное количество user_post
так что будет много значений внутри IN
пункт (100 <х <5000+).
Является IN
ограничено? Есть ли другой способ сделать это? Раньше я делал так:
for (UserPost userPost : user.getUserPosts()) {
Link link = userPost.getPost().getLink();
//
}
Но решение, приведенное выше, требует очень много времени для выполнения, поэтому я ищу более оптимизированное.
1 ответ
Да, предложение IN ограничено:
Количество значений в списке IN ограничено только значением max_allowed_packet.
В Oracle ограничение установлено в 1000 элементов.
Вместо того, чтобы выбирать посты пользователей, а затем перебирать их, чтобы получить их ссылку, или выдавать другой запрос, чтобы получить их, вы можете загрузить ссылки в том же запросе, что и посты пользователя:
select userPost from UserPost userPost
left join fetch userPost.post post
left join fetch post.link link;
Этот запрос будет загружать все сразу, и итерацию, пока пользователь публикует и получает свою ссылку, используя userPost.getPost().getLink()
не будет вызывать дополнительный запрос.