解决 JPA 和 Hibernate 中的 N 1 问题
当执行过多的查询来检索关系数据时,就会出现 N 1 问题。例如,在 Hibernate 中,初始查询获取 N 条记录,并且需要 N 个附加查询来检索每条记录的关联记录。
要解决此问题,请使用 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();
此 JOIN FETCH 急切获取后关联,从而消除了 N 1 个查询。
如果需要获取多个子关联,在初始查询中获取一个集合,并在后续查询中获取其他集合。
自动检测
集成测试非常适合检测 N 1 问题。 db-util 项目提供了自动 JUnit 断言来验证生成的 SQL 语句的预期数量:
@Test public void shouldNotHaveANPlusOneQuery() { // code to configure and execute db-util Assert.assertCountOfSqlStatementsPerformed(1); }
以上是如何解决JPA和Hibernate中的N 1问题?的详细内容。更多信息请关注PHP中文网其他相关文章!