>  기사  >  Java  >  JPA 및 Hibernate의 N 1 쿼리 문제를 어떻게 해결할 수 있습니까?

JPA 및 Hibernate의 N 1 쿼리 문제를 어떻게 해결할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-13 06:26:021032검색

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

JPA 및 Hibernate에서 N 1 쿼리 문제 해결

N 1 문제는 쿼리가 N 레코드를 검색하고 후속 쿼리가 관련 항목을 가져올 때 발생합니다. 추가 N개의 쿼리로 이어집니다. 이는 초기 쿼리 중에 연관을 가져오지 않을 때 Hibernate에서 발생할 수 있습니다.

원인과 결과

설명하기 위해 PostComment 엔터티를 검색하는 다음 JPA 쿼리를 고려하십시오.

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

이후에 주석을 반복하고 게시물 연결에 액세스하면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.