흰 스타렉스에서 내가 내리지

TypeQuery 와 Query 본문

JPA

TypeQuery 와 Query

주씨. 2024. 4. 13. 00:51
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