Tackling the N 1 Problem in JPA and Hibernate
The N 1 issue arises when excessive queries are executed to retrieve relational data. For instance, in Hibernate, an initial query fetches N records, and N additional queries are needed to retrieve associated records for each.
To resolve this problem, utilize JOIN FETCH:
List<PostComment> comments = entityManager.createQuery( "select pc from PostComment pc join fetch pc.post p where pc.review = :review" ) .setParameter("review", review) .getResultList();
This JOIN FETCH eager-fetches the post association, eliminating the N 1 queries.
If multiple child associations need fetching, fetch one collection in the initial query and the others with subsequent queries.
Automatic Detection
Integration testing is ideal for detecting the N 1 issue. The db-util project provides an automatic JUnit assert to validate the expected count of SQL statements generated:
@Test public void shouldNotHaveANPlusOneQuery() { // code to configure and execute db-util Assert.assertCountOfSqlStatementsPerformed(1); }
The above is the detailed content of How to Solve the N 1 Problem in JPA and Hibernate?. For more information, please follow other related articles on the PHP Chinese website!