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); }
以上是如何解决JPA和Hibernate中的N 1问题?的详细内容。更多信息请关注PHP中文网其他相关文章!