1

これが私の簡略化されたデータベースです:

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 <x <5000+)。

IN制限はありますか?それを行う他の方法はありますか?以前、私はこのようにそれをしていました:

for (UserPost userPost : user.getUserPosts()) {
    Link link = userPost.getPost().getLink();
    //
}

しかし、上記のソリューションは実行に非常に時間がかかるため、より最適化されたソリューションを探しています。

4

1 に答える 1

4

はい、IN句は制限されています:

INリストの値の数は、max_allowed_pa​​cket値によってのみ制限されます。

Oracleでは、制限は1000要素に設定されています。

ユーザーの投稿を選択し、それらを繰り返してリンクを取得したり、別のクエリを発行して取得したりする代わりに、ユーザーの投稿と同じクエリでリンクを読み込むことができます。

select userPost from UserPost userPost
left join fetch userPost.post post
left join fetch post.link link;

このクエリはすべてを一度にロードし、ユーザーが投稿を繰り返してリンクを取得してuserPost.getPost().getLink()も、追加のクエリはトリガーされません。

于 2012-06-21T09:32:04.283 に答える