解决 JPA 和 Hibernate 中的 N 1 问题
在 JPA 和 Hibernate 中,当执行多个查询时会出现 N 1 查询问题检索相关数据,导致数据获取效率低下。为了解决这个问题,Hibernate 提供了一系列技术。
理解 N 1 问题
当初始查询检索主实体并触发后续查询时,会出现此问题来获取相关数据。例如,获取 PostComment 实体而不预取相关的 Post 实体将强制 Hibernate 对每个访问的 Post 实例执行额外的查询。
Hibernate 中的解决方案
1。连接获取:
通过利用“连接获取”策略,可以在单个查询中与主要实体一起检索相关数据。在我们的示例中,我们可以使用:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
2。集合预取:
在获取主要实体的集合和相关数据的附加集合时,建议预取后者。一种选择是在初始查询中预取集合:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList(); ListpostTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class) .setParameter("commentPosts", comments) .getResultList();
3。二次查询:
预取效率不高或者需要获取多个子关联的情况下,可以采用二次查询策略。使用基本查询检索主要实体,并使用后续查询来获取相关数据。
使用 db-util 自动检测
db-util 库提供了自动检测 N 1 查询问题的方法。 JUnit 断言可用于验证生成的 SQL 语句的预期数量,从而在开发过程的早期发现问题。
以上是如何解决 JPA 和 Hibernate 中的 N 1 查询问题?的详细内容。更多信息请关注PHP中文网其他相关文章!