首页 > Java > java教程 > 正文

如何解决 JPA 和 Hibernate 中的 N 1 查询问题?

Susan Sarandon
发布: 2024-11-17 07:40:03
原创
121 人浏览过

How Can You Address the N 1 Query Issue in JPA and Hibernate?

解决 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();

List postTags = 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板