경로표현식
- 상태필드: 단순 값 저장 필드 (m.username), 추가 탐색 불가
- 단일값 연관필드: XXXToOne연관, 추가 탐색 가능(member.team.teamname), 묵시적 inner join발생
- 컬렉션 값 연관 필드: XXXToMany연관, 추가 탐색 불가, 묵시적 inner join 발생
- 직접 명시적 조인으로 사용
페치조인
JPQL에서 성능 최적화를 위해 제공되는 기능
연관된 엔티티나 컬렉션을 같이 조회하는 기능
fetch전략을 LAZY로 설정을 해두더라도 가지고 올때 한번에 조회를 한다
다대일 페치조인
- jpql
select m from Member m join fetch m.team
- sql로 변환시
select m.*, t.* from Member m inner join team t on m.team_id = t.id
-----------fetch join사진 첨부 ---------------
일대다 페치조인
결과가 중복이 되어 수가 증가가 될 수 있다
---> 하나의 값이 여러개의 값을 연관되어 있기 때문
distinct
를 사용해서 중복을 제거할 수 있다
sql측면에서는 distinct
를 사용하면 행의 모든 데이터가 같아야지 distinct가 되지만 JPA에서는 같은 식별자를 가진 엔티티를 제거를 한다
주의!!
- 페치 조인 대상에 별칭 불가
별칭을 사용하여 where절에서 조건을 줘서 일부의 결과만을 가지고 온다면 데이터 수가 달라져서 무결성이 깨질 수 있으므로 사용을 하는데 조심을 해야한다
하지만 단순 조회상황에서는 조심히 사용을 해야한다
가능하면 따로 쿼리를 사용하여 조건을 탐색을 해야한다
- 대상을 기준으로 on절 조건 추가 불가
- with-clause not allowed on fetch association에러 발생
String query = "select t from Team t join fetch t.members m on m.name=:memberName";
List<Team> result = em.createQuery(query, Team.class).setParameter("memberName", "member1")
.getResultList();
for (Team team : result) {
System.out.println("team = " + team);
}
```
System.out.println("team = " + team);
.getResultList();
- 일대다 페치 조인을 사용하면 페이징을 할 수가 없다
DB에서 모든 데이터를 가져와서 메모리에서 페이징을 하게 된다 --> 메모리 초과 에러 발생 가능
페이징을 해야한다면 페치조인을 사용하지 않고 @BatchSize()
를 이용하여 한번에 가져오도록 한다
해당 어노테이션을 사용하지 않으면 다쪽 테이블을 조회하는 쿼리가 N번 발생하게 되어 성능이 안나올 수 있다
벌크연산
변경감지를 사용하는 것이 아니라 executeUpdate()
를 사용하여 update쿼리 실행
주의사항: 벌크연산을 먼저 실행 후 영속성컨텍스트 초기화
참고
자바 ORM 표준 JPA 프로그래밍 - 기본편_김영한 님 강의
https://www.inflearn.com/course/ORM-JPA-Basic
책 - 자바 ORM 표준 JPA 프로그래밍
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
'공부기록 > JPA' 카테고리의 다른 글
JPA - 복합키 (0) | 2023.03.19 |
---|---|
JPA Proxy 객체 사용 기 (0) | 2023.01.06 |
JPA-JPQL (0) | 2022.01.28 |
JPA-값타입 (0) | 2022.01.27 |
JPA-프록시 (0) | 2022.01.26 |