250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 동적sql
- exclusive lock
- FetchType
- dfs
- querydsl
- 지연로딩
- 다대일
- JPQL
- execute
- 스프링 폼
- 힙
- 다대다
- BOJ
- 데코레이터
- 유니크제약조건
- SQL프로그래밍
- CHECK OPTION
- 스토어드 프로시저
- PS
- 비관적락
- eager
- fetch
- 낙관적락
- 이진탐색
- 일대다
- 백트래킹
- 연결리스트
- 연관관계
- 즉시로딩
- shared lock
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
TypeQuery 와 Query 본문
728x90
- 반환할 타입을 명확하게 지정할 수 있으면 TypeQuery 객체를 사용한다
- 반환 타입을 명확하게 지정할 수 없으면 Query 객체를 사용한다.
# TypeQuery
TypedQuery<Member> query =
em.createQuery("SELECT m FROM Member m", Member.class);
List<Member> resultList = query.getResultList();
for (Member member : resultList) {
System.out.println("member = " + member);
}
- em.createQuery() 의 두 번째 파라미터에 반환할 타입을 지정하면 TypeQuery 를 반환하고,
- 지정하지 않으면 Query 를 반환한다.
- 조회 대상이 Member 엔티티이므로 조회 대상 타입이 명확하다.
# Query
Query query =
em.createQuery("SELECT m.username, m.age FROM Member m");
List resultList = query.getResultList();
# 1
for (Object o : resultList) {
Object[] result = (Object[]) o; // 결과가 둘 이상이면 Object[] 반환
System.out.println("username = " + result[0]);
System.out.println("age = " + result[1]);
}
# or 2
List<Object[]> resultList =
em.createQuery("SELECT o.member, o.product, o.orderAmount FROM Order o")
.getResultList();
for (Object[] row : resultList){
Member member = (Member) row[0];
Product product = (Product) row[1];
int orderAmount = (Integer) row[2];
}
- 조회 대상이 String 타입인 username 과, Integer 타입인 age 이므로 조회 대상 타입이 명확하지 않다.
- 이처럼 SELECT 절에서 여러 엔티티나 컬럼을 선택할 때는 반환할 타입이 명확하지 않으므로 Query 객체를 사용해야 한다.
- Query 객체는 SELECT 절의 조회 대상이 예제처럼 둘 이상이면 Object[] 를 반환하고, SELECT 절의 조회 대상이 하나면 Object 를 반환한다.
- 예를 들어, SELECT m.username FROM Member m 이면 Object 를 반환,
- SELECT m.username, m.age FROM Member m 이면 Object[] 를 반환한다.
# 결과 조회
- query.getResultList() : 결과를 예제로 반환한다. 만약 결과가 없으면 빈 컬렉션을 반환한다.
- query.getSingleResult() : 결과가 정확히 하나일 때 사용한다.
- 결과가 없으면 NoResultException 예외가 발생한다.
- 결과가 1개보다 많으면 NotUniqueResultException 예외가 발생한다.
- 결론 ㅣ getSingleResult() 는 결과가 정확히 1개가 아니면 예외가 발생한다.
'JPA' 카테고리의 다른 글
JPQL 에서 new 를 이용하여 DTO 클래스로 변환하여 받기 (0) | 2024.04.13 |
---|---|
JPQL 파라미터 바인딩 (0) | 2024.04.13 |
고아 객체 (0) | 2024.04.10 |
프록시와 즉시로딩/지연로딩 (0) | 2024.04.08 |
일대일 식별 관계 (0) | 2024.04.04 |