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 回答