Принимает ли предложение 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() не будет вызывать дополнительный запрос.

Другие вопросы по тегам