JPA와 휴지 상태를 사용할 때 JOIN과 JOIN FETCH의 차이점은 무엇입니까?
일반 JOIN을 사용하는 곳과 JOIN FETCH를 사용하는 곳을 알려주세요.예를 들어 이 두 개의 쿼리가 있는 경우
FROM Employee emp
JOIN emp.department dep
그리고.
FROM Employee emp
JOIN FETCH emp.department dep
그들 사이에 어떤 차이가 있나요?그렇다면 어떤 것을 언제 사용해야 합니까?
이 2개의 쿼리에서는 JOIN을 사용하여 적어도1개의 부서가 관련되어 있는 모든 종업원을 조회합니다.
단, 첫 번째 쿼리에서는 Employes for the Hibernate만 반환됩니다.두 번째 쿼리에서는 고용자와 관련된 모든 부서를 반환합니다.
따라서 두 번째 쿼리를 사용하는 경우 각 직원의 부서를 보기 위해 데이터베이스를 다시 검색하기 위해 새 쿼리를 수행할 필요가 없습니다.
두 번째 쿼리는 각 직원의 부서가 필요할 때 사용할 수 있습니다.부서가 필요하지 않은 경우 첫 번째 쿼리를 사용합니다.
WHERE 조건(필요할 가능성이 있는 것)을 적용할 필요가 있는 경우는, 이 링크를 참조해 주세요."where" 절을 JPA 2 CriteriaQuery로 사용하여 JPQL "join fetch"를 올바르게 표현하려면 어떻게 해야 합니까?
갱신하다
★★★★★★★★★★★★★★★를 사용하지 않는 경우는fetch
, 「」가 계속 반환되는 은, 「와「DepartmentDepartments」)의(「Memployee」와「Departments」)이 입니다.@OneToMany
로합니다.FetchType.EAGER
', ' ' HQL( ')')fetch
not와 함께 질문하거나 질문하지 .FROM Employee
모든 부서가 표시됩니다.은 *ToOneToOne)*ToOne(ToOne)입니다.@ManyToOne
★★★★★★★★★★★★★★★★★」@OneToOne
는 디폴트로는 오버하다
이전에 코멘트에 기재되어 있던 이 링크에서, 다음의 부분을 읽어 주세요.
"fetch" join을 사용하면 단일 선택을 사용하여 상위 개체와 함께 관련성 또는 값 모음을 초기화할 수 있습니다.이는 컬렉션의 경우 특히 유용합니다.매핑 파일의 외부 결합 선언 및 지연 선언을 연결 및 수집에 대해 효과적으로 덮어씁니다.
이 "JOIN FETCH"는 다음과 같은 경우에 적용됩니다(예: = FetchType).엔티티 내부 컬렉션의 LAGY(예: 아래).
또한 "쿼리가 언제 발생해야 하는지"라는 방법에만 영향을 미칩니다.그리고 다음 사항도 알아야 합니다.
hibernate에는 어소시에이션의 취득 시기와 취득 방법이라는2개의 직교 개념이 있습니다.그것들을 혼동하지 않는 것이 중요하다.퍼포먼스를 조정하기 위해 fetch를 사용합니다.lazy를 사용하여 특정 클래스의 분리된 인스턴스에서 항상 사용할 수 있는 데이터에 대한 계약을 정의할 수 있습니다.
어소시에이션이 취득된 경우 --> 「FETCH」유형
취득 방법 --> 가입/선택/서브셀렉트/배치
이 경우 FETCH는 다음과 같은 부서가 Entity 내에 집합으로 있는 경우에만 적용됩니다.
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
사용할 때
FROM Employee emp
JOIN FETCH emp.department dep
얻을 수 있다emp
★★★★★★★★★★★★★★★★★」emp.dep
. 하지 않은 에도 .fetch를 사용할 수 emp.dep
그러나 hibernate는 다른 선택 항목을 데이터베이스로 처리하여 해당 부서 집합을 가져옵니다.
퍼포먼스 튜닝의 문제일 뿐입니다.단일 쿼리(필요 여부)로 모든 결과를 얻거나(필요 여부) 나중에 필요할 때 쿼리할 수 있습니다(필요 여부).
하나의 선택(큰 쿼리 하나)으로 작은 데이터를 가져와야 할 경우 빠른 가져오기를 사용하십시오.또는 느린 가져오기를 사용하여 나중에 필요한 항목(많은 작은 쿼리)을 쿼리합니다.
다음과 같은 경우 fetch를 사용합니다.
취득하려는 엔티티 내에 불필요한 대규모 컬렉션/세트 없음
응용 프로그램 서버에서 데이터베이스 서버로의 통신이 너무 멀어서 시간이 오래 걸립니다.
액세스 권한이 없는 경우 나중에 해당 컬렉션이 필요할 수 있습니다(트랜잭션 메서드/클래스의 추가).
합류하다
「」를 사용하고 JOIN
JPA는 생성된 SQL 문에서 상위 엔티티 테이블과 하위 엔티티 테이블 간에 JOIN을 생성합니다.
예를 들어 이 JPQL 쿼리를 실행할 때 다음 절차를 수행합니다.
FROM Employee emp
JOIN emp.department dep
휴지 상태에서는 다음 SQL 문이 생성됩니다.
SELECT emp.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
SQL †에해 주세요.
SELECT
에는 " " "만 포함되어 있습니다.employee
컬럼, " " columns"입니다.department
, 하나, 하나를 간다.department
의 칸, '표', '표', '표', '표', '표', '표', '표', '표', '표', '표', '표', '표', '표', '표', 씁니다.JOIN FETCH
JOIN
.
결합 페치
★★★와 비교해서...JOIN
, . . . . . . . .JOIN FETCH
하면 결합 할 수 있습니다.SELECT
SQL을 사용합니다.
이 예에서는 이 JPQL 쿼리를 실행할 때 다음과 같이 합니다.
FROM Employee emp
JOIN FETCH emp.department dep
휴지 상태에서는 다음 SQL 문이 생성됩니다.
SELECT emp.*, dept.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
「」: 「」가 되는 것에 해 주세요.
department
에FROM
JPQL 항 jp
ㅇㅇㅇㅇ.JOIN FETCH
를 사용하면 엔티티 어소시에이션을 초기화할 수 있기 때문에, 휴지 상태를 사용할 때 를 해결하는 좋은 방법입니다.FetchType.LAZY
가져오는 기본 엔티티와 함께 가져오기 전략을 지정합니다.
가지고 계신 경우@oneToOne
매핑 세트FetchType.LAZY
두 번째 쿼리(부문 오브젝트를 Employee 오브젝트의 일부로 로드해야 하기 때문에)를 사용하면 휴지 상태에서는 DB에서 취득하는 각 Employee 오브젝트에 대해 부서 오브젝트를 가져오기 위한 쿼리를 발행합니다.
나중에 코드에서 Employee-to-Department 단일값 연결을 통해 부서 개체에 액세스할 수 있으며 Hibernate는 지정된 직원의 부서 개체를 가져오는 쿼리를 발행하지 않습니다.
최대 절전 모드는 가져온 직원 수와 동일한 쿼리를 계속 발행합니다.Hibernate는 위의 두 쿼리에서 동일한 수의 쿼리를 발행합니다(모든 종업원 객체의 부서 객체에 액세스하려면).
Dherik: 당신이 뭐라고 하는지 잘 모르겠어요, fetch를 사용하지 않을 때 결과는 다음과 같습니다.List<Object[ ]>
이는 오브젝트 테이블 목록을 의미하며 Employee 목록이 아닙니다.
Object[0] refers an Employee entity
Object[1] refers a Departement entity
fetch를 사용하는 경우 선택 항목은 1개뿐이며 결과는 Employee 목록입니다.List<Employee>
부서 목록이 포함되어 있습니다.이것은 엔티티의 게으른 선언을 덮어씁니다.
언급URL : https://stackoverflow.com/questions/17431312/what-is-the-difference-between-join-and-join-fetch-when-using-jpa-and-hibernate
'IT이야기' 카테고리의 다른 글
구성 요소 내부에 생성된 FullCalendar 개체 내부에서 Vue 구성 요소 개체에 액세스하는 중 (0) | 2022.05.30 |
---|---|
Vue 메서드 호출 (0) | 2022.05.29 |
데이터 구조가 "침입적"이라는 것은 무엇을 의미합니까? (0) | 2022.05.29 |
열거 서수에서 열거 형식으로 변환 (0) | 2022.05.29 |
메서드 인수에 Not Null 주석 사용 (0) | 2022.05.29 |