Notice
Recent Posts
Recent Comments
Link
250x250
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 미니정리
- node.js
- jsp
- oracle
- Next.js
- 스프링
- 서버
- 데이터베이스
- 코드테스트
- 스프링부트
- BACK-END
- spring
- JavaScript
- web
- 프론트엔드
- 백엔드
- SQL
- java
- 정리
- 알고리즘
- 쿼리
- 자바
- 프런트엔드
- jpa
- MySQL
- 코드 테스트
- 프로그래머스
- 디자인 패턴
- 자바스크립트
- 오라클
Archives
- Today
- Total
참치코더의 꿈 메모장
JPA / 다형성 쿼리, 엔티티 직접 사용 정리 본문
728x90

다형성 쿼리
- JPA에서 상속구조가 있을때 부모타입으로 쿼리를 날리면 JPA가 자동으로 자식 엔티티들을 함께
조회하는 것을 말한다.
Item에 Album, Book이 상속되어 있다고 가정할때 Item 뿐만 아니라 Album, Book 엔티티도
전부 조회한다.
|
1
2
3
4
|
List<Item> items = em.createQuery("select i from Item i", Item.class)
.getResultList();
//JPA가 내부적으로 자식 테이블까지 다 합쳐서 하나의 결과로 만들어 준다.
|
cs |
TYPE
- TYPE 키워드를 사용하여 상속관계에서 특정 자식만 조회가 가능하다.
- 이 객체가 실제로 특정 자식 타입인 경우만 필터링해서 가져온다.
|
1
2
3
|
List<Item> books = em.createQuery(
"select i from Item where type(i) = Book", Item.class)
.getResultList();
|
cs |
TREAT
- Treat를 사용해서 Item 엔티티로 다운캐스팅하여 해당 자식 임베디드 타입 데이터만 가져올 수 있다.
- 이 객체를 특정 자식 타입이라고 가정하고 다운캐스팅해서 접근하는 기능이다.
|
1
2
3
|
List<String> authors = em.createQuery(
"select treat(i as Book).author from Item i", String.class)
.getResultList();
|
cs |
다형성 쿼리의 장단점
장점
- 객체지향적인 코드로 상속 구조를 그대로 조회할 수 있다.
- 유지보수성과 추상화 수준이 높다.
단점
- JOIN이 많아져서 쿼리가 복잡해 질 수 있다.
- 불필요한 테이블 접근으로 성능 저하가 발생 할 수 있다.
- 자식이 많을수록 SQL이 비효율적으로 길어진다.
따라서 상속관계일때 필요한 자식 타입만 조회할때는 TYPE과 TREAT를 적절하게 사용해야 한다.
엔티티 직접 사용
- JPQL에서 엔티티 객체 자체를 값처럼 사용하는 것을 말한다.
- JPA는 자동으로 해당 엔티티의 식별자(PK)로 변환해서 쿼리를 실행한다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
Member member = em.find(Member.class, 1L);
List<Order> result = em.createQuery(
"select o from Order o where o.member = :member", Order.class)
.setParameter("member", member)
.getResultList();
// 여기서 :member는 실제 SQL 실행 시 member_id(외래키) 값으로 변환된다.
List<Member> result = em.createQuery(
"select m from Member m where m = :member", Member.class)
.setParameter("member", member)
.getResultList();
// 여기서 :member 도 결국에 m.id = member.id 로 변환된다.
|
cs |
728x90
'JPA' 카테고리의 다른 글
| JPA / N+1 문제 및 해결 방법 (0) | 2026.02.03 |
|---|---|
| JPA / Named Query, 벌크 연산 기본 정리 (0) | 2025.11.10 |
| JPA / 경로 탐색, 패치 조인 미니 정리 (0) | 2025.11.05 |
| JPA / JPA 프로젝션, 페이징 API, JOIN 정리 (0) | 2025.10.29 |
| JPA / 값 타입 컬렉션(Value Type Collection) 정리 (0) | 2025.10.27 |
Comments