1

HHH90003004: firstResult/maxResults specified with collection fetch; applying in memory

⚠️ HHH90003004: firstResult/maxResults specified with collection fetch; applying in memory

Это предупреждение, которое выведет хибернейт, если для осуществления пагинации ему придется загрузить ВСЕ данные из таблицы, а не по одной странице.

🤔 Почему возникает?
Например, у нас есть две сущности: Post и Comment. Каждый пост может иметь множество комментариев:
@entity
public class Post {

@Id
private Long id;

private String title;

@OneToMany
private List<Comment> comments;
}

@entity
public class Comment {

@Id
private Long id;

private String content;
}
Посты мы достаем с помощью репозитория (делаем join fetch, чтобы подтянуть всё одним запросом):
public interface PostRepository extends JpaRepository<Post, Long> {

@Query("SELECT p FROM Post p JOIN FETCH Comment c)
List<Post> findAll(Pageable pageable);
}

С точки зрения базы данные будут выглядеть примерно так:
p.id | p.title | c.id | c.content
---------------------------------
1 | пост1 | 1 | коммент1
1 | пост1 | 2 | коммент2
2 | пост2 | 3 | коммент3
То есть, количество записей не будет совпадать с количество постов (на каждый пост будет приходиться столько записей, сколько у этого поста комментариев), из-за этого применить пагинацию на уровне sql не получится.

Хибер это понимает и ему приходится делать пагинацию на уровне кода, а для этого надо выгрузить все данные.

👨‍🔧 Как пофиксить?