> Java > java지도 시간 > 본문

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

Susan Sarandon
풀어 주다: 2024-11-17 07:40:03
원래의
120명이 탐색했습니다.

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

JPA 및 Hibernate에서 N 1 문제 해결

JPA 및 Hibernate에서 여러 쿼리가 실행될 때 N 1 쿼리 문제가 발생합니다. 관련 데이터를 검색하므로 데이터 가져오기가 비효율적입니다. 이를 해결하기 위해 Hibernate는 다양한 기술을 제공합니다.

N 1 문제 이해

초기 쿼리가 기본 엔터티를 검색하고 후속 쿼리가 트리거될 때 문제가 발생합니다. 관련 데이터를 가져옵니다. 예를 들어, 관련 Post 엔터티를 프리페치하지 않고 PostComment 엔터티를 페치하면 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿