首页 > Java > java教程 > 如何解决 JPA 和 Hibernate 中的 N 1 查询问题?

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

Susan Sarandon
发布: 2024-11-13 06:26:02
原创
1066 人浏览过

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

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

当查询检索 N 条记录并且后续查询获取相关记录时,就会出现 N 1 问题记录,导致额外的 N 次查询。当在初始查询期间未获取关联时,在 Hibernate 中可能会发生这种情况。

因果关系

为了说明这一点,请考虑以下检索 PostComment 实体的 JPA 查询:

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc where pc.review = :review", PostComment.class)
.setParameter("review", review)
.getResultList();
登录后复制

如果我们随后迭代注释并访问 post 关联,Hibernate 将发出以下 SQL 语句:

SELECT pc.id AS id1_1_, pc.post_id AS post_id3_1_, pc.review AS review2_1_
FROM   post_comment pc
WHERE  pc.review = 'Excellent!'

INFO - Loaded 3 comments

SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_
FROM   post pc
WHERE  pc.id = 1

INFO - The post title is 'Post nr. 1'

SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_
FROM   post pc
WHERE  pc.id = 2

INFO - The post title is 'Post nr. 2'

SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_
FROM   post pc
WHERE  pc.id = 3

INFO - The post title is 'Post nr. 3'
登录后复制

这里,执行三个附加查询来获取 Post 实体对于每条评论。这是 N 1 查询问题。

解决方案

为了解决这个问题,我们可以使用 JOIN FETCH 关键字急切地获取所需的关联:

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class)
.setParameter("review", review)
.getResultList();
登录后复制

对于多个子关联,建议在初始查询中获取一个集合,并通过辅助查询加载其余集合。

自动检测

检测 N 个1 问题中,使用 SQL 日志记录和断言来实现集成测试以验证生成的 SQL 语句的预期数量是有益的。 db-util 等工具可以帮助完成此过程。

以上是如何解决 JPA 和 Hibernate 中的 N 1 查询问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

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