본문 바로가기
Java/JPA

[SpringBoot_JPA_1] TypedQuery

by HJ0216 2023. 6. 2.

이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 수강하며 정리한 글입니다.

 

 

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

TypedQuery

: 작성한 JPQL을 실행시키기 위해 만드는 쿼리 객체

 * 반환 Type이 확실할 경우 TypedQuery, 불확실할 경우 Query 사용

 

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
    public List<Order> findAllByString(OrderSearch orderSearch) {
 
        String jpql = "select o from Order o join o.member m";
        boolean isFirstCondition = true;
 
        // 주문 상태 검색
        if (orderSearch.getOrderStatus() != null) {
            if (isFirstCondition) { // status 추가
                jpql += " where";
                isFirstCondition = false;
            } else {
                jpql += " and";
            }
            jpql += " o.status = :status";
        }
 
        TypedQuery<Order> query = em.createQuery(jpql, Order.class)
                .setMaxResults(1000);
 
        if (orderSearch.getOrderStatus() != null) {
            query = query.setParameter("status", orderSearch.getOrderStatus());
        }
 
        return query.getResultList();
    }
 
 
 

1. createQuery()

: 쿼리 생성

 - createQuery(jpql, returnType)

🚨 조회 column이 2개 이상일 경우, 배열로 반환되지만 TypedQuery<Order[]>로 선언하지 않음

→ 쿼리 결과가 Order[]로 지정되는 것이 아니라 개별 Order 엔티티 객체들의 컬렉션 또는 결과 목록으로 반환되기 때문에 TypedQuery<Order>를 유지

 

2. setMaxResults()

: 조회 결과 수 제한

 

3. setParameter()

: 위치 또는 이름기준 파라미터 바인딩

 - setParameter(바인딩 될 변수, 바인딩 될 값)

cf. 이름 기준 바인딩

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
    public List<Order> findAllByString(OrderSearch orderSearch) {
 
        String jpql = "select o from Order o join o.member m";
        boolean isFirstCondition = true;
 
        // 주문 상태 검색
        if (orderSearch.getOrderStatus() != null) {
            if (isFirstCondition) { // status 추가
                jpql += " where";
                isFirstCondition = false;
            } else {
                jpql += " and";
            }
            jpql += " o.status = ?1";
        }
 
        TypedQuery<Order> query = em.createQuery(jpql, Order.class)
                .setMaxResults(1000);
 
        if (orderSearch.getOrderStatus() != null) {
            query = query.setParameter(1, orderSearch.getOrderStatus());
        }
 
        return query.getResultList();
    }
 
 
 

: status → ?1

"status" → 1

 

4. getResultList()

: 결과를 컬렉션(데이터 집합)으로 반환, 없을 경우 빈 컬렉션을 반환하며 1건이라도 1건이 저장된 컬렉션 반환

cf. getSingleResult()

: 결과가 1건일 때 사용하며, 없을 경우-NoResultException, 2건 이상일 경우-NonUniqueResultException 발생

 

 

 

참고 자료

 

[jpa] JPQL

JPA에서 현재까지 사용했던 검색은 아래와 같다. 식별자로 조회 EntityManager.find() 객체 그래프 탐색 e.g. a.getB().getC() 하지만 현실적으로 이 기능만으로 어플리케이션을 개발하기에는 무리이다. 그

joont92.github.io